diff options
Diffstat (limited to 'util/alevt')
67 files changed, 32030 insertions, 0 deletions
diff --git a/util/alevt/COPYRIGHT b/util/alevt/COPYRIGHT new file mode 100644 index 0000000..17930ea --- /dev/null +++ b/util/alevt/COPYRIGHT @@ -0,0 +1,297 @@ +This message applies to all files within the archive: + +    Copyright (C) 1998,1999,2000 Edgar Toernig (froese@gmx.de) +    All rights reserved. + +    This program is free software; you can redistribute it and/or modify +    it under the terms of the GNU General Public License Version 2 as +    published by the Free Software Foundation. + +    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. + + +And here's the GNU GPL V2: + +		    GNU GENERAL PUBLIC LICENSE +		       Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. +                          675 Mass Ave, Cambridge, MA 02139, 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 Library 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 diff --git a/util/alevt/ChangeLog b/util/alevt/ChangeLog new file mode 100644 index 0000000..896ddc3 --- /dev/null +++ b/util/alevt/ChangeLog @@ -0,0 +1,535 @@ +Thu Feb 11 22:05:00 MET 2010	(1.7.0) + +    - redesigned version: +    - outfile, new starting methods, libzvbi implementation +    - lots of bug fixes, all patches available in the Internet applied +    - extensive code cleanup + +Mon Dec  3 03:11:07 MET 2007	(1.6.2) + +    - compilation fixes for newer gcc +    - makefile tweaks (man vs share/man, /usr/X11R6 vs /usr, etc) +    - default device changed to /dev/vbi0 +    - adapt to current v4l2 api +    - some minor fixes collected during the past years + +    This is a build-time update to conform to newer compilers and +    system environments.  If you have a running AleVT there's no +    reason to update.  The only real fix is in the html-exporter +    which was producing broken html (missing double-quotes). + +Thu Jan 23 01:53:10 MET 2003 + +    - Fixed a bug in contrib/cap-all.c (fdset_init before vbi_open) +    - Expaned cap-all.c to show how to save in two formats simultaneously. + +Tue Aug 20 05:22:16 MEST 2002	(1.6.1) + +    - Removed the bttv-warning from the help pages ;-) + +Mon Jul 23 18:34:32 MEST 2001 + +    - Fixed bug in ui.c - found by <pawel@sakowski.eu.org>. +    - When clicking on page numbers accept sub-page numbers too. + +Sat Dec 23 15:12:11 MET 2000 + +    - Fixed 'double height last line' bug in export.c reported by +      <Matthias.Kleinmann@urz.uni-heidelberg.de> + +Thu Oct 12 02:19:31 MEST 2000 + +    - The   fix was wrong.  Removed it. + +Wed Oct 11 19:41:38 MEST 2000	(1.6.0) + +    - Some documentation tweaks. +    - Release.  Made it 1.6 because of V4l2 API. + +Thu Sep 21 21:07:12 MEST 2000 + +    - Removed old bttv-only decoder.  Only the v4l2-based stays. +      If the device does not support v4l2, default parameters +      appropriate for the bttv-driver are taken. +    - Subpage cycling (up/down and 2nd wheel) stays in the current +      page. + +Sat Sep 16 23:52:12 MEST 2000 + +    - Experimental v4l2 interface added. +    - Finetune defaults to 1 now.  Works best for me.  Tell me +      if you don't like it. +    - Russian patch still not added :-/ +    - Fixed the bug in xio.c that Ben Smithurst +      <ben@scientia.demon.co.uk> found. +    - Added the dual-wheel-mouse patch from Holger Fitzner. + +Tue May 30 03:09:24 MEST 2000 + +    - As Matto Fransen <matto@matto.nl> reported: the ; after   +      in exp-html is missing.  fixed that. + +Tue May  9 20:21:52 MEST 2000 + +    - Removed the -oldbttv/-newbttv options.  If your driver has +      a buffer size different from that in the current bttv you +      either have to support the VBISIZE ioctl or change the source. +      (Tried to implement an autodetect by non-blocking reads but +      that confuses the driver that much that it no longers gives +      reasonable data.) +    - Added a compression option to the png export filter and +      changed the default compression level to the lib's default. +      The prev default of 9 was way to slow. + +Wed May  3 19:18:55 MEST 2000 + +    - Added a smaller font.  Made out of the neep9 font from +      the really great jmk-fonts (http://www.pobox.com/~jmknoble). + +Sat Apr 29 02:36:41 MEST 2000 + +    - Fixed SEGV in export.c:adjust. +    - Fixed a possible buffer overrun in exp-txt.c + +Thu Nov  4 21:18:52 MET 1999	(1.5.1) + +    - Added os.h.  That way alevt compiles right out of the +      box on all BSD systems (I hope *g*). +    - Fixed the DST bug in alevt-date. +    - Put vtwiz.pl in contrib, a perl/tk/set-tv script to +      launch alevt written by Joern Borgert. + +Tue Oct 26 23:55:09 MEST 1999	(1.5.1-pre1) + +    - Added timeout option to alevt-cap. +    - Use install instead of cp in the Makefile. +    - Added -I/usr/local/include and -L/usr/local/lib +      in the Makefile. +    - Changed #ifdef FREEBSD to #ifdef BSD. +    - exchanged contrib/paul-export.patch with +      paul.fmt_page.c (a replacement for export.c:fmt_page()) +      and paul.fmt_page.patch (the same in form of a +      patch file). +    - Some doc corrections. + +Thu Oct 14 02:49:48 MEST 1999 + +    - Added FREEBSD patches. + +Fri Oct  8 23:36:45 MEST 1999	(1.5.0) + +    - Updated the documentation. + +    So, what's new since 1.4.9 (nearly 4 months ago)? +    Two major things: full latin-2 support and export +    filters for alevt-cap and alevt itself. + +    For the latin-2 support page enhancement packets +    have to be decoded and some latin-1 pages may +    benefit from that, too.  Note: if you select +    latin-2 everything is latin-2, even cut'n paste. +    (new cmdline option -charset latin-1|2) + +    The export filters allow saving pages in different +    formats.  At the moment there's ascii (with and with- +    out color), html, png, and ppm.  The png filter +    requires libpng.  If you don't have it (or don't want +    png support) just remove the WITH_PNG from the +    Makefile.  To save the currently displayed page just +    press 's'.  See alevt-cap(1) for the format string. + +    Preview: 1.5.1 will have the FreeBSD patches and +    any bug fixes.  (But not more *g*). + +Fri Oct  8 02:06:35 MEST 1999	(1.5.0-pre4) + +    Finally I could get away from my Playstation and +    work a little bit on alevt *g* + +    - Tried to change alevt-date with freebsd patches from +      Thomas Runge <runge@rostock.zgdv.de>.  They do not +      have the timezone and daylight variables.  But I do +      not have tm_gmtoff.  So it's commented out for the +      moment. +    - Made font.[ch] so that only one copy of the fonts is +      in the executable when including export modules +      (exp-gfx.c uses them).  Had to tweak the makefile. +    - Added 's' for saving pages to files.  Prompts for +      a format string and a filename and saves the +      currently displayed page. +      (Formerly, 's' and 'S' were aliases for '/' and '?' +      (searching)) +    - Found a bug in export.c regarding double height lines. +    - Added a patch to the contrib dir to pass the URL you +      click on to netscape. + +    The documentation updates are still missing.  That's +    the last thing to do for 1.5.0.  But that's so boring... + +Fri Aug 20 21:28:18 MEST 1999 + +    Back from holidays and time for alevt... + +    - Added html, png, and ppm export modules from Paul. +    - Fixed the return status for export_output. +    - Tweaked the makefile for libpng support. +    - Added the export howto to the contrib dir. +    - Added Paul's fmt_page routine to contrib as a patch +      to export.c +    - Added "-format help" to list all output formats and +      its options. + +    Still to do: update man page of alevt-cap, add export +    to alevt, add erc to alevt-cap. + +    Oh, btw, alevt is running on FreeBSD with the bt848 +    driver from Roger Hardiman <roger@cs.strath.ac.uk> *g*. +    I wonder if it's possible to port his driver to linux. +    Maybe it runs better then bttv... (I still get reports +    with stuck xawtvs ...) + +Mon Jul 19 01:15:50 MEST 1999	(1.5.0-pre3) + +    - Added export modules.  It's gotten much to complex. + +    A lot of things still to do:  add other formats [Paul?], +    add documentation, add format-help, add export to alevt, +    add erc to alevt-cap, ... + +Mon Jul 12 00:09:03 MEST 1999 + +    - Added an incomplete 20x24 font to the contrib dir. + +Tue Jun 29 00:46:03 MEST 1999	(1.5.0-pre2) + +    - Added lanugage tables from Radoslaw. +    - Added new latin-2 font from Radoslaw. +    - Fixed a bug with hold graphics.  There's still one bug +      on CNN's page 100 (has to do with set-after behaviour of +      color select in hold graphics mode).  The last line of the +      earth should be blue-blue-green not blue-green-green. +      AleVT always uses set-at behaviour.  Afaik, this combination +      (hold + set-after) is the only way to see the difference +      between set-at and set-after.  Set-after will blow up the +      code so I will leave it as it is. +    - vbi now collects all pkt26 and enhances the page before +      it is passed on.  Seem's to work. + +Tue Jun 22 22:13:45 MEST 1999	(1.5.0-pre1) + +    - Fixed hamm24.  And, it should be fast now *g* +    - Moved the language conversion parts to lang.c +    - Added additional lang_chars for use with the latin-2 charset. +    - Added -charset latin-1/2 option. +    - Added pkt x/26 decoding.  ... and noticed, that these packets +      are sent between line 0 and 1.  FUCK.  Now I have to save +      all x/26 until the page is complete.  But not today... :-( + +      Things are getting more and more uglier.  The right thing +      to do would be to make a big font with all possible chars +      (including cyrillic, arabic, smoothed graphics, ...). +      That would mean to make each char in vtp->data 16 bit.   +      And then add an attribute word for each char so that the +      enhanced attributes work, too.  Searching and cut & paste +      would be more complicated...  but the worst, the pages +      will be much bigger (4 times larger).  Really bad for +      the cache and god knows for what else... +      Is it worth all the trouble???  I don't need that! + +Tue Jun 15 01:25:40 MEST 1999 + +    - Changed .specs file again.  I previously changed alevt.spec +      instead of alevt.spec.in :-( + +Mon Jun 14 23:45:48 MEST 1999	(1.4.9) + +    - Made a very simple capture program (alevt-cap).  Just collects +      the given pages and writes them to disk in ASCII. +      I will only accept bug reports/fixes, no enhancement requests  +      at the moment *g* +      (I can't believe it; I even wrote a man page...) +    - Changed the subpage delimiter on the command line from '/' to '.' +      The old one ('/') is still accepted.  (Reason: alevt-cap uses +      the page number as part of the filename and a / is inconvenient. +      And I already wanted to let you enter subpages with the keypad +      and the '.' would be a nice key for that.) +    - Tweaked the .specs file...  (Btw, alevt-date and alevt-cap should +      not be installed in the X11 tree.) + +Thu Jun 10 22:13:40 MEST 1999 + +    - moved the hamming decoding and associated table to hamm.c +    - played with pkt26 to support polish stations.  not finished. + +Tue Jun  8 21:00:42 MEST 1999 + +    - Added -[no]bell option.  And the 'b' key. +    - Replaced all xio_bell calls with appropriate status messages. + +Sat Jun  5 00:42:19 MEST 1999	(1.4.8) + +    - Shit.  Just after the release I found a bug.  The header line +      isn't updated as it should :-(  (Just affects parallel mode +      transmission, so no new version, yet.) +    - Created mailing list.  Either go to http://alevt.listbot.com/ +      or write mail to alevt-subscribe@listbot.com. +    - Added bttv-patch to the contrib dir for those who don't want +      to wait for bttv-0.6.5. + +Fri Jun  4 17:19:41 MEST 1999	(1.4.7) + +    - Added autodetection of VBIBUF_SIZE (only with newer bttv, 0.6.5). +    - Forgot to close vbi_fd in vbi_close :-/ +    - Made ERC on by default.  If the page has no errors it +      costs nothing and if it has you'll turn it on anyway. +    - Changed parameters of EV_HEADER. +    - Removed XAWTV_HACKS. +    - Updated some docu. +    - Modified the contrib samples to reflect previous API changes. + +Fri May 28 20:16:44 MEST 1999 + +    - Added status messages. +    - Added EV_TIMER event. +    - Added channel change detection (only with newer bttv, 0.6.5). +      Sends EV_RESET event.  The XAWTV_HACKS can be removed *phww*. +      Now the cache is automatically cleared if you switch to a +      new channel.  It even works with a SAT receiver connected to +      Video-In. + +Thu May 27 23:54:32 MEST 1999	(1.4.6 unofficial) + +    - Cache reset didn't reset npages and hi_subno. +    - Added XAWTV_HACKS, that is: alevt scans for a window with +      the _XAWTV_STATION property and registers for property changes. +      Result: when switching channels in xawtv, the cache is cleared. +      (This is just an ugly hack.  Xawtv must already be running +      when alevt is started.  If you quit and restart xawtv, it no +      longer works.  There's no method to detect if the monitored +      xawtv is really the one controlling our /dev/vbi, etc...) +      Added on request of Paul Ortyl <ortylp@key.net.pl>. +    - Added error reduction circuit.  It's part of the cache. +      Errors in a new page are replaced by characters/lines from +      an already cached (older) page.  May be toggled by pressing +      'e' (editor is now on 'E').  It's not enabled by default +      because it takes some CPU time.  Idea by Paul Ortyl. +    - TODO: clean up.  document new features.  add status messages. + +Sun May 23 19:13:07 MEST 1999	(1.4.5) + +    - New spec file from Karsten Hopp <karsten.hopp@delix.de> +    - Changed it even further *g* +    - Fixed a bug with graphics selection of double height lines. +    - Documented the -oldbttv option in the man page.  Now it's in +      every page.  This should finally halve the mails I get. +      (For the other halve I have to write alevt-capture *g*) + +Sat May  8 02:41:21 MEST 1999 + +    - Ehhh, changed u32 typedef from unsigned long to unsigned int. +      Same for s32.  The Alpha's longs are 64 bits. +      Thanks to Sdruddin Rejeb <rejeb@dpmail.epfl.ch>. +      (There's something strange with this in the X libs.  They are +      sometimes very lazy about ints and longs.  Someone with an +      Alpha should check the cut & paste, both, text and graphics +      selections.) + +Thu Apr 29 22:38:37 MEST 1999 + +    - Updated contrib/t1.c +    - Added ':' as a subpage delimiter for clicking (2:7 is the same as 2/7) + +Mon Apr 19 19:40:09 MEST 1999 + +    - Switched the scrolling direction of the wheel + +Mon Mar 29 01:23:06 MEST 1999	(1.4.4) + +    - fixed DST bug in alevt-date +    - added crude latin-2 support.  'make FONT=latin-2' should be enough. +      (found the stuff on the website http://www.penguin.cz/~marvin/ of +      Daniel Smolik <smolikdan@email.cz>.  I don't know if he is the one +      who made the font). + +Wed Mar 17 20:53:59 MET 1999 + +    - added timeout to alevt-date + +Fri Feb 19 18:22:53 MET 1999	(1.4.3> + +    - Makefile changes. + +Fri Jan 29 18:01:27 MET 1999 +     +    - fixed bug in dllist.h.  dl_insert_first(h, dl_remove(n)) was only +      working due to gcc implementation details. + +Mon Jan 25 18:33:42 MET 1999	(1.4.2) + +    - fixed 'clear cache'.  no longer removes the help pages. +    - made next/prev key/button to skip missing pages. +    - added support for wheeled mice.  (I heard it's really cool *g*) +    - problem with subpages > 0xff fixed. + +Thu Jan 21 17:31:46 MET 1999	(1.4.1) + +    - added man pages from Thomas Schoepf <schoepf@usa.net>. +    - added rpm-spec file from Mario Mikocevic <mozgy@times.hr>. +      (looks a little bit odd, but I don't know very much about rpms) +    - minor option fix in alevt-date (people are really using it!?!) + +Tue Jan  5 03:50:08 MET 1999	(1.4.0) + +    - should be 1.3.10 but that gives problems with the help pages :-( +    - fixed varargs for alpha +    - default is now -newbttv (aka -fuckbttv).  use -oldbttv for v<0.5.20. + +Sat Jan  2 21:40:54 MET 1999 + +    - small patches to alevt-date (-vbi options and tzset fix) +    - played with pkt8/30.  what a mess.  MTV is 25:13 ahead *g* + +Wed Dec 30 19:30:14 MET 1998	(1.3.9) + +    - slightly modified the pll (may need further tuning) + +Wed Dec 30 05:27:26 MET 1998	(1.3.8) + +    - added pll (-finetune auto).  try -debug for status msgs. + +Tue Dec 29 05:15:53 MET 1998	(1.3.7) + +    - added finetune option (see README) +    - you may now type -newbttv instead of -fuckbttv *g* + +Mon Dec 28 19:36:32 MET 1998	(1.3.6) + +    - Makefile: R5 -> R6  :-( +    - vbi.c now works without cache.c +    - added alevt-date (set system time from teletext) +    - bug in option parsing (error reporting) + +Thu Dec 17 19:56:16 MET 1998	(1.3.5) + +    - added -L/usr/X11R6/lib in Makefile +    - put some blurb (in german) in contrib. + +Thu Dec 17 05:01:34 MET 1998	(1.3.4) + +    - added class hints on (invisible) leader window to make docking +      in wmaker easier.  instant name for leader is "VTLeader" and for +      the viewing windows "VTPage" +    - made the icon a little bit smaller + +Mon Dec 14 23:05:41 MET 1998	(1.3.3) + +    Release 1.3.3 + +    - added spanish/portuguese charset decoding +    - added similar looking glyphs for czech +    - minor changes on the font +    - middle click on current page number opens new parent window +    - case dependant search if the pattern begins with a '!' +    - line editing may be aborted with ^C + +Sun Dec 13 17:55:32 MET 1998	(1.3.2) + +    - when there were multiple windows of the same page, cycling through +      the subpages changed all windows.  fixed. +    - hilight the found text (make it the selection). +    - slightly modified the hilight colors. +    - default window size set to 41x25 (looks better). +    - rewrote the editor. + +Sun Dec 13 07:03:10 MET 1998	(1.3.1) + +    - fixed one command line option +    - corrected bug in searching + +Sat Dec 12 20:27:03 MET 1998	(1.3.0) + +    Release 1.3.0 + +    - searching is now ready (still need a status line for error msgs). +    - set SIGPIPE to SIG_DFL.  some shells (KDE) set it to SIG_IGN and then +      the timer task won't be killed on exit. +    - updated the help pages. +    - I'm frustrated!  BTTV_VERSION doesn't work on /dev/vbi.  So no +      autodetection of driver version.  Added -fuckbttv option instead. + +Fri Dec 11 19:36:03 MET 1998	(1.2.5) + +    - reworked national charset (lang) handling.  everthing now done in vbi.c. +      the rest just deals with latin-1. +    - first version of searching (functional, but dirty.  needs more work.) + +Thu Dec 10 20:06:27 MET 1998	(1.2.4) + +    - new file edline.c (line editor for the menu line. start for searching...) +    - blinking cursor +    - added an 48x48 icon from Ulf Rompe +    - added pasting into the line editor (insert key). +    - release ownership of XA_PRIMARY when deselecting selection. + +Tue Dec  8 21:26:26 MET 1998	(1.2.3) + +    - new file ui.c (most user interface stuff from main.c) +    - rewrote option parsing +    - allow specification of child windows on command line. now +      it's possible to regenerate the complete window layout by +      the commandline (may be of some use for session management). +    - some spelling fixes in the help pages from Mark Bryars + +Mon Dec  7 16:59:28 MET 1998	(1.2.2) + +    - reworked hidden handling in xio.c + +Sun Dec  6 19:54:10 MET 1998	(1.2.1) + +    - class name changed!  from Alevt to AleVT. +    - window/icon title shows current page number +    - changed the icon to a 64 pixel width one.  not nice but ... +    - added a small mini icon for the title bar. is there a property I can set? +    - pressing on the CPN puts the page on hold +    - pressing on the violet * reveals concealed text +    - added simple menu if no FastText menu is present +    - allow subpages to be specified on the command line (eg 100/4) + +Sat Dec  5 20:59:51 MET 1998	(1.2.0) + +    Release 1.2.0 + +    - finished the help pages. +    - added command line handling +    - added user geometry handling in xio.c + +Sat Dec  5 02:28:16 MET 1998	(1.1.2) + +    - allow magazin 9 (help system) +    - start box char after a pagenumber selects subpage 1 (hack) +    - added a crude page editor (just to create the help pages.  not for users.) +    - started with the online help system (sounds great, hehe) + +Tue Dec  1 20:19:53 MET 1998	(1.1.1) + +    - added concept of parent and child windows.  now, the middle mouse +      button changes the contens of the child window.  if there isn't +      one, it is created. +    - Middle mouse button on x/y (subpage cycling) selects the previous +      subpage.  (updating the child with subpages is hairy...) + +Sun Nov 29 23:34:18 MET 1998	(1.1.0) + +   Release 1.1.0 + +   - removed most of the recovery for single bad lines (does too much harm) +   - changed handling of parallel mode transmission (untested.  unused in .de) +   - added selection (text & graphic!).  try pasting into xpaint :-) +   - added cache-clear function ('c') +   - click on x/y selects the next subpage +   - some minor tweaks +   - added an icon bitmap. + +Wed Nov 24 23:33:34 MET 1998	(1.0.0) + +    First Release 1.0.0 diff --git a/util/alevt/EXPORT.HOWTO b/util/alevt/EXPORT.HOWTO new file mode 100644 index 0000000..b9fba67 --- /dev/null +++ b/util/alevt/EXPORT.HOWTO @@ -0,0 +1,84 @@ +HOW TO IMPLEMENT A NEW EXPORT MODULE: + +As an example look at exp-txt.c (it implements two modules which +are pretty similar). + +You have to create one exported structure (struct export_module). +This structure holds the following data: + +1. The name of the format (example: "ascii"). + +2. The default extension to use for building filenames ("txt"). + +3. A list of module options. It's a 0 terminated array of char +pointers, one for each option (similar to argv of main). +If an option string contains a '=', it is an option that +requires an argument.  The part after the '=' is ignored at +the moment.  Later, I want to add help messages that show +these options strings and then the part after the '=' becomes +useful. +If you do not have local options, set this field to 0. + +4. The number of bytes for local data in the export structure. +There you may store data collected during option parsing or +for whatever you want. +Don't use global variables for storing this data!  With +alevt-cap you may give: + +alevt-cap -format ascii,color 100  -format ascii 100 + +to save the page in two different formats.  Using global +vars would inhibit this.  The data area in struct export +starts at the 'data' field.  You have to cast it to the +appropriate type (see the D macro in exp-txt.c). +If you do not need local data, set this field to 0. + +5. An open function (or call it constructor).  It is called +when your module is needed and it is passed a struct export +(the instance).  This function may be used to initialize +the local data in the export struct. +If all goes well return 0.  Else call export_error (see +below) and return -1. +If you do not need an open function, set this field to 0. + +6. A close function (or call it destructor).  It is called +when your module is no longer needed.  If you allocated +memory in the open func, this is the place to free it. +If you do not need a close function, set it to 0. + +7. An option function.  It is called for each module option +the user has given.  It is passed an option number (first +option in the option-array gives 1, ...) and a char pointer +to the argument for that option (0 if the option does not +need an arg).  The argument pointer keeps valid until the +close function is called. +If all goes well, return 0.  Else call export_error and +return -1. +If you gave an option list at point 3 you have to specify +this function.  Else set it to 0. + +8. An output function.  It is called to produce the output. +It is given the file name to use and a fmt_page pointer. +The fmt_page contains an interpreted image of the page. +There are no control chars in it.  It uses the character +set defined by the two fonts. +These function may be called consecutive for multiple +pages.  Don't expect one output for one open/close. +Return codes as above... (0: ok,  -1: error). + +The export_error function:  If one of your functions wants to +report an error, it has to use the export_error function. +It's a printf like function to set error messages.  In alevt-cap +these messages are printed to stderr, in alevt they will be +shown in the status line (so don't make them too long). + +The last step is to add your export_module structure to the +list of modules in export.c (at the top). +Please, make sure that this structure is the only exported +symbol.  All other things should be static. + +That's all.  A structure describing your module and 4 functions +(open, close, option, output) to implement it.  Shouldn't be too +complicated. + +Ciao, ET. diff --git a/util/alevt/Makefile b/util/alevt/Makefile new file mode 100644 index 0000000..2f7c8da --- /dev/null +++ b/util/alevt/Makefile @@ -0,0 +1,130 @@ +VER=1.7.0 +OPT=-O -g -w +DEFS=-DWITH_PNG +DEFS+=-DUSE_LIBZVBI +FONT=vtxt +MAN_DIR=man +DESTDIR= +PREFIX=/usr +HOSTCC=$(CC) +CFLAGS=$(OPT) -DVERSION=\"$(VER)\" $(DEFS) -I$(USR_X11R6)/include +EXPOBJS=export.o exp-txt.o exp-html.o exp-gfx.o font.o +OBJS=main.o ui.o xio.o fdset.o vbi.o cache.o help.o search.o misc.o hamm.o lang.o $(EXPOBJS) +TOBJS=alevt-date.o vbi.o fdset.o misc.o hamm.o lang.o +COBJS=alevt-cap.o vbi.o fdset.o misc.o hamm.o lang.o $(EXPOBJS) + +ifneq ($(findstring WITH_PNG,$(DEFS)),) +EXPLIBS=-lpng -lz -lm +endif + +ifneq ($(findstring USE_LIBZVBI,$(DEFS)),) +ZVBILIB=-lzvbi -lpthread +EXPLIBS+=$(ZVBILIB) +endif + +all: alevt alevt-date alevt-cap alevt.1 alevt-date.1 alevt-cap.1 + +alevt: $(OBJS) +	$(CC) $(OPT) $(OBJS) -o alevt -L$(PREFIX)/lib -L$(PREFIX)/lib64 -lX11 $(EXPLIBS) + +alevt-date: $(TOBJS) +	$(CC) $(OPT) $(TOBJS) -o alevt-date $(ZVBILIB) + +alevt-cap: $(COBJS) +	$(CC) $(OPT) $(COBJS) -o alevt-cap $(EXPLIBS) + +font.o: font1.xbm font2.xbm font3.xbm font4.xbm +fontsize.h: font1.xbm font2.xbm font3.xbm font4.xbm +	fgrep -h "#define" font1.xbm font2.xbm font3.xbm font4.xbm >fontsize.h + +font1.xbm: bdf2xbm $(FONT)-latin-1.bdf +	./bdf2xbm font1 <$(FONT)-latin-1.bdf >font1.xbm + +font2.xbm: bdf2xbm $(FONT)-latin-2.bdf +	./bdf2xbm font2 <$(FONT)-latin-2.bdf >font2.xbm + +font3.xbm: bdf2xbm vtxt-koi8.bdf +	./bdf2xbm font3 <vtxt-koi8.bdf >font3.xbm + +font4.xbm: bdf2xbm vtxt-iso8859-7.bdf +	./bdf2xbm font4 <vtxt-iso8859-7.bdf >font4.xbm + +bdf2xbm: bdf2xbm.c +	$(HOSTCC) bdf2xbm.c -o bdf2xbm + +clean: +	rm -f *.o page*.txt a.out core bdf2xbm font?.xbm fontsize.h +	rm -f alevt alevt-date alevt-cap + +rpm-install: all +	install -m 0755 alevt        ${RPM_BUILD_ROOT}$(USR_X11R6)/bin +	install -m 0755 alevt-date   ${RPM_BUILD_ROOT}$(USR_X11R6)/bin +	install -m 0755 alevt-cap    ${RPM_BUILD_ROOT}$(USR_X11R6)/bin +	install -m 0644 alevt.1      ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1 +	install -m 0644 alevt-date.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1 +	install -m 0644 alevt-cap.1  ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1 +	install -d 0755 $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps +	install -m 0644 alevt.png $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps + +install: all +	install -m 0755 alevt		$(DESTDIR)$(PREFIX)/bin +	install -m 0755 alevt-date	$(DESTDIR)$(PREFIX)/bin +	install -m 0755 alevt-cap	$(DESTDIR)$(PREFIX)/bin +	install -m 0644 alevt.1		$(DESTDIR)$(PREFIX)/share/man/man1 +	install -m 0644 alevt-date.1	$(DESTDIR)$(PREFIX)/share/man/man1 +	install -m 0644 alevt-cap.1	$(DESTDIR)$(PREFIX)/share/man/man1 +	install -m 0644 alevt.png $(DESTDIR)$(PREFIX)/share/pixmaps +	install -m 0644 alevt.desktop $(DESTDIR)$(PREFIX)/share/applications + +uninstall: clean +	rm -f /usr/bin/alevt /usr/bin/alevt-cap /usr/bin/alevt-date \ +	/usr/share/pixmaps/alevt.png /usr/share/applications/alevt.desktop \ +	/usr/share/man/man1/alevt.1 /usr/share/man/man1/alevt-cap.1 \ +	/usr/share/man/man1/alevt-date.1 + +depend: +	makedepend -Y -- $(CFLAGS_none) -- *.c 2>/dev/null + +tar-html: alevt.1 alevt-date.1 alevt-cap.1 +	for i in alevt.1 alevt-date.1 alevt-cap.1 ; do \ +	    j=`basename $$i .1` ; \ +	    j=`basename $$j .1x` ; \ +	    nroff -man $$i | { \ +		echo "<HTML><HEAD><TITLE>AleVT</TITLE></HEAD><BODY>" ; \ +		man2html -bare -uelem U -nodepage ; \ +		echo "</B0DY></HTML>" ; \ +	    } | sed -e "s,</B> <B>, ,g" -e "s,</U> <U>, ,g" >~/exit/alevt/$$j.html ;\ +	done + +tar: tar-html clean +	sed s/VERSION/$(VER)/g <alevt.lsm.in >~/exit/alevt/alevt-$(VER).lsm +	sed s/VERSION/$(VER)/g <alevt.spec.in >alevt.spec +	cd .. ;\ +	    ln -s alevt alevt-$(VER) ;\ +	    tar vcfz ~/exit/alevt/alevt-$(VER).tar.gz alevt-$(VER)/* ;\ +	    rm alevt-$(VER) +	cat <CHANGELOG >~/exit/alevt/changes + +# DO NOT DELETE + +alevt-cap.o: vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h export.h +alevt-date.o: os.h vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h +cache.o: misc.h dllist.h cache.h vt.h help.h +exp-gfx.o: lang.h misc.h vt.h export.h font.h fontsize.h +exp-html.o: lang.h misc.h vt.h export.h +exp-txt.o: os.h export.h vt.h misc.h +export.o: vt.h misc.h export.h +fdset.o: dllist.h misc.h fdset.h +font.o: font1.xbm font2.xbm font3.xbm font4.xbm +hamm.o: vt.h misc.h hamm.h +help.o: vt.h misc.h vt900.out vt901.out vt902.out vt903.out vt904.out vt905.out +help.o: vt906.out vt907.out vt908.out vt909.out vt910.out vt911.out vt912.out +lang.o: misc.h vt.h lang.h +main.o: vt.h misc.h fdset.h dllist.h xio.h vbi.h cache.h lang.h ui.h +main.o: search.h +misc.o: misc.h +search.o: vt.h misc.h cache.h dllist.h search.h +ui.o: vt.h misc.h xio.h dllist.h vbi.h cache.h lang.h fdset.h +ui.o: search.h export.h ui.h +vbi.o: os.h vt.h misc.h vbi.h dllist.h cache.h lang.h fdset.h hamm.h +xio.o: vt.h misc.h dllist.h xio.h fdset.h lang.h icon.xbm font.h fontsize.h diff --git a/util/alevt/README b/util/alevt/README new file mode 100644 index 0000000..83985f0 --- /dev/null +++ b/util/alevt/README @@ -0,0 +1,72 @@ +Hi, + +this software is not just a program, it's moreover a legend. +It is THE protagonist of all videotext applications under Linux. + +During the past 10 years the video standards, the APIs, the kernel +have seen lots of changes. +But unfortunately this program has NOT seen much maintenance. +The results of that misfit appearance are: + +1. lots of forks flying around in the Internet +2. lots of patches flying around, some good, some disgusting, some out of time +3. lots of cruft which is completely outdated or obsolete for other reasons + +To handle all that in one big effort I decided to redesign the program +completely, enlarging its capabilities for DVB-S at the same time. + +So here are the changes: + +1. Erasure of old help pages and rename / reorganize / update the rest +-> redesign of the online help system / implying alevt-date and alevt-cap + +2. Erasure of old outdated integers, functions, parameters: + +- bell, big_buf, debug, display, editor, erc, fine_tune, newbttv, +- oldbttv + +3. Coding style cleanups (no superfluous comments, not more than +   80 characters per column, no uncommented code. + +4. No strange characters in the outfile, latin alphabet in purity instead. + +5. Alevt can be started in 4 modes now if you are running it in DVB mode: + +- by service id (sid) +- by teletext pid (ttpid) +- by channel name +- without parameter + +6. Starting it in DVB mode on the command line it presents you +a table with human readable values such as sid, teletext pid, +PMT (Program Map Table), provider name, service name, language, service type. +This makes it easier for you to start multiple teletext windows +in multiple console sessions manually. + +If working with a script and the option -o (outfile) you can +also start multiple teletext windows of all channels in a transponder. +I develop a GUI using TCL / TK 8.5 and Iwidgets 4.01 to do that and other +tasks graphically (i. e. by mouse click). + +7. If you install the program on the command line by typing "make & +   make install" there is an uninstaller now to revert the installation: +   "make uninstall". + +ENJOY IT! + +Uwe Bugla, February 11th, 2010. + +External dependencies + +AleVT needs some system libraries to be installed in your system. +They are zlib, libX11, libpng and libzvbi. + +Credits go to: +- Andreas Rottmann from debian.org for compiler fixes and +  other kinds of investigation. +- Francesco Lavra for supplying a kernel patch to avoid kernel demux +  incompatibilities with kernels >= 2.6.32 +- Andy Walls for helpful investigation in kernelspace +- Edgar Toernig for providing the source version 1.6.2 and doing all the +  development for the basic versions +- Tom Zoerner for the implementation of libzvbi diff --git a/util/alevt/README.OLD b/util/alevt/README.OLD new file mode 100644 index 0000000..4fb0e41 --- /dev/null +++ b/util/alevt/README.OLD @@ -0,0 +1,78 @@ +Hi,						Menden, 21 Sep 2000 + +    This program decodes and displays Videotext/Teletext from a +    /dev/vbi device. + + +COMPILE & INSTALL: + +    There's nothing to configure.  A simple 'make' is all. +    If you do not want png support remove the WITH_PNG in +    the Makefile.  Additionally, if you want a smaller font +    uncomment the "FONT=neep9" line. + +    It gives you 'alevt', 'alevt-date', and 'alevt-cap' and +    their man pages 'alevt.1x', 'alevt-date.1', and 'alevt-cap.1'. + +    You can install them where ever you want (i.e. /usr/local/bin). +    The programs are self-contained and require no other files. + +    NOTE: Be careful with 'make install'.  It's just for me :-) + + +PROBLEMS: + +    If you have a lot of decoding errors (lot of these lightning symbols) +    you may try pressing the 'f' and 'F' key.  This allows fine tuning of +    the decoder circuit.  There's also a -finetune command line option. +    This should only be necessary on really bad signals. + +    Maybe, I add autotuning later... + +    UPDATE: added autotuning.  It's the default.  If you add -debug the +    the actions of the pll are printed to stdout. + +    To get the old (pre finetune) behaviour start it with -finetune 0. + +    UPDATE: disabled autotuning *g*  sometimes it's too jumpy... + + +ALEVT-DATE: +    I added a little tool to set the system time from the videotext +    time.  The date is not interpreted (not even transmitted on some +    channels).  So it allows only adjustment of +/-12 hours. +    The default allowed adjustment is limited to +/-2 hours (use +    -delta to change).  Without the -set option it just display +    the date in the format of the date command.  Look at strftime(3) +    for possible control sequences you may use in the -format option. + + +HACKING: + +    If you want to play with the font size, you may resize it with +    xv (xv font1.xbm).  Just make sure, that its width is a multiple of +    32 and its height a multiple of 8.  A simple make will create +    a version of AleTV with the new font.  Warning: a make clean +    will erase font1.xbm.  The next make will recreate font.xbm from +    vtxt.bdf. + +    AleVT has a built in page editor.  If you start it with -editor +    you may press 'E' to invoke it.  For the usage you have to consult +    the sources.  (It's very crude!) + + +TODO: (no specific order) + +    - Error correction in alevt-cap +    - Better language support.  Internal 16-bit charset. +    - Separated graphics. +    - Rewrite the whole stuff.  A networked teletext daemon and clients +      that connect to it for display, capture, cgi, ... + + +NEWER VERSIONS: + +    The primary site of AleVT is http://goron.de/~froese + +Have fun, +Edgar Toernig (froese@gmx.de) diff --git a/util/alevt/ReadmeGR b/util/alevt/ReadmeGR new file mode 100644 index 0000000..68d32c2 --- /dev/null +++ b/util/alevt/ReadmeGR @@ -0,0 +1,28 @@ +29-9-2003 + +ÅëëçíéêÜ ãéá ôï ALEVT  +Ç ðñïóèÞêç Åëëçíéêþí Ýãéíå ôñïðïðïéþíôáò ôï patch alevt-1.6.3.rus.diff ðïõ âñßóêåôå óôï öÜêåëï +contrib óôá sources  ôïõ alevt-1.6.3 + +ÎåêéíÞóôå ôï ðñüãñáììá ìå ôçí ðáñÜìåôñï  + +alevt -charset iso8859-7  + +ç  + +alevt -charset el + +ÄïõëåéÝò ðïõ Ý÷ïõí íá ãßíïõí: +Êáëýôåñïò ó÷åäéáóìüò ôïõ font file vtxt-iso8859-7.bdf  +ïé Áããëéêïß ÷áñáêôÞñåò ìïéÜæïõí óáí bold óå ó÷Ýóç ìå ôïõò Åëëçíéêïýò êáé õðÜñ÷ïõí  +êÜðïéá ìéêñÜ ðñïâëçìáôÜêéá ìå ôïõò graphics  (0x01 -0x1f) + +¸ëåã÷ïò ãéá ôï áí áðåéêïíßæïíôáé óùóôÜ üëïé ïé ÷áñáêôÞñåò + +¼ðïéïò èÝëåé íá âïçèÞóåé ðáñáêáëþ íá ìïõ óôåßëåé ôçò áëëáãÝò ôïõ óôï sl45sms@yahoo.gr +Áí êÜðïéïò êÜíåé åêôåôáìÝíåò áëëáãÝò ðïõ äåí áöïñïýí ôá ÅëëçíéêÜ èá ðñÝðåé íá ôéò óôåßëåé êáé +óôïí óõããñáöÝá ôïõ ðñïãñÜììáôïò + +ÍåüôåñÜ áñ÷åßá ôïõ ðáñüíôïò èá ìðïñåßôå íá âñßóêåôå óôï  http://go.to/sl45sms/alevt/index.html + +ÓêáñâÝëçò Ðáíáãéþôçò diff --git a/util/alevt/TODO b/util/alevt/TODO new file mode 100644 index 0000000..4b56676 --- /dev/null +++ b/util/alevt/TODO @@ -0,0 +1,12 @@ +Hi, these are issues that I unfortunately cannot resolve myself: + +1. graphical menu written in GKT2, to be used in general connection with +    the outfile (-o) option. + +2. for usage without script and outfile option: +    DVB monitoring demon helping the program to rewrite the PAT when the +    external player software has chosen a channel which is part of a +    new transponder. +    At the moment alevt hangs when the transponder is changed. + +Uwe Bugla, February 11th, 2010. diff --git a/util/alevt/alevt-cap.1 b/util/alevt/alevt-cap.1 new file mode 100644 index 0000000..2af1879 --- /dev/null +++ b/util/alevt/alevt-cap.1 @@ -0,0 +1,53 @@ +.TH alevt-cap 1 "February 07, 2010" +.SH NAME +alevt-cap \- capture teletext windows. +.SH SYNOPSIS +.B alevt-cap +.RI [ options ] +.br +.SH DESCRIPTION +This manual page documents briefly the +.B alevt-cap +commands. +.PP +\fBalevt-cap\fP is a program to capture teletext pages. +.SH OPTIONS +.TP +.B \-cs -charset <latin-1/2/koi8-r/iso-8859-7> +character set +.TP +.B \-f -format <fmt[,options]> +format to save +.TP +.B \-f help -format help +lists available storage formats +.TP +.B \-h -help +print this page +.TP +.B \-n -name <filename> +page name to save +.B \-t -timeout <secs> +timeout +.TP +.B \-s -sid <sid> +service pid +.TP +.B \-t -ttpid <ttpid> +teletext pid +.TP +.B \-v -vbi <vbidev> +vbi device +.TP +Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0 +.TP +ppp.ss stands for a page number and an optional +subpage number (example: 123.4). +.TP +.SH SEE ALSO +.BR alevt-date (1) , alevt (1). +.br +.SH AUTHOR +alevt-cap was written by Edgar Toernig <froese@gmx.de>. +.PP +This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>. diff --git a/util/alevt/alevt-cap.c b/util/alevt/alevt-cap.c new file mode 100644 index 0000000..9e0c3bd --- /dev/null +++ b/util/alevt/alevt-cap.c @@ -0,0 +1,280 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <locale.h> +#include <signal.h> +#include <unistd.h> +#include "vt.h" +#include "misc.h" +#include "fdset.h" +#include "vbi.h" +#include "lang.h" +#include "dllist.h" +#include "export.h" + +static volatile int timed_out = 0; +static char *channel; +char *outfile = ""; +u_int16_t sid; + + +struct req +{ +    struct dl_node node[1]; +    char *name; // file name +    char *pgno_str; // the pgno as given on the cmdline +    int pgno, subno; // decoded pgno +    struct export *export; // export data +    struct vt_page vtp[1]; // the capture page data +}; + + +static void usage(FILE *fp, int exitval) +{ +    fprintf(fp, "\nUsage: %s [options] ppp.ss...\n", prgname); +    fprintf(fp, +	    "\n" +	    "  Valid options:\t\tDefault:\n" +	    "    -cs -charset\t\tlatin-1\n" +	    "    <latin-1/2/koi8-r/iso8859-7>\n" +	    "    -f -format <fmt,options>\tascii\n" +	    "    -f help -format help\n" +	    "    -h -help\n" +	    "    -n -name <filename>\t\tttext-%%s.%%e\n" +	    "    -s -sid <sid>\t\t(none;dvb only)\n" +	    "    -to -timeout <secs>\t\t(none)\n" +	    "    -t -ttpid <ttpid>\t\t(none;dvb only)\n" +	    "    -v -vbi <vbidev>\t\t/dev/vbi\n" +		"                 \t\t/dev/vbi0\n" +		"                 \t\t/dev/video0\n" +		"                 \t\t/dev/dvb/adapter0/demux0\n" +	    "\n" +	    "  ppp.ss stands for a page number and an\n" +	    "  optional subpage number (ie 123.4).\n" +	); +    exit(exitval); +} + + +static void exp_help(FILE *fp) +{ +    struct export_module **ep; +    char **cp, c; + +    fprintf(fp, +	    "\nSyntax: -format Name[,Options]\n" +	    "\n" +	    "    Name\tExt.\tOptions\n" +	    "    --------------------------------\n" +	); +    for (ep = modules; *ep; ep++) +    { +	fprintf(fp, "    %-7s\t.%-4s", (*ep)->fmt_name, (*ep)->extension); +	for (c = '\t', cp = (*ep)->options; cp && *cp; cp++, c = ',') +	    fprintf(fp, "%c%s", c, *cp); +	fprintf(fp, "\n"); +    } +    fprintf(fp, +	    "\n" +	    "Common options: reveal,hide\n" +	    "Example: -format ansi,reveal,bg=none\n" +	    "\n" +	); +    exit(0); +} + + +static int arg_pgno(char *p, int *subno) +{ +    char *end; +    int pgno; + +    *subno = ANY_SUB; +    if (*p) +    { +	pgno = strtol(p, &end, 16); +	if ((*end == ':' || *end == '/' || *end == '.') && end[1]) +	    *subno = strtol(end + 1, &end, 16); +	if (*end == 0) +	    if (pgno >= 0x100 && pgno <= 0x899) +		if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f)) +		    return pgno; +    } +    fatal("%s: invalid page number", p); +} + + +static int option(int argc, char **argv, int *ind, char **arg) +{ +    static struct { char *nam, *altnam; int arg; } opts[] = { +	{ "-charset", "-cs", 1 }, +	{ "-format", "-f", 1 }, +	{ "-help", "-h", 0 }, +	{ "-name", "-n", 1 }, +	{ "-sid", "-s", 1 }, +	{ "-timeout", "-to", 1 }, +	{ "-ttpid", "-t", 1 }, +	{ "-vbi", "-v", 1 }, +    }; +    int i; + +    if (*ind >= argc) +	return 0; + +    *arg = argv[(*ind)++]; +    for (i = 0; i < NELEM(opts); ++i) +	if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam)) +	{ +	    if (opts[i].arg) +		if (*ind < argc) +		    *arg = argv[(*ind)++]; +		else +		    fatal("option %s requires an argument", *arg); +	    return i+1; +	} + +    if (**arg == '-') +    { +	fatal("%s: invalid option", *arg); +	usage(stderr, 2); +    } + +    return -1; +} + + +static void event(struct dl_head *reqs, struct vt_event *ev) +{ +    struct req *req, *nxt; + +    switch (ev->type) +    { +	case EV_PAGE: // new page +	{ +	    struct vt_page *vtp = ev->p1; + +	    for (req = PTR reqs->first; nxt = PTR req->node->next; req = nxt) +		if (req->pgno == vtp->pgno) +		    if (req->subno == ANY_SUB || req->subno == vtp->subno) +		    { +			*req->vtp = *vtp; +			dl_insert_last(reqs + 1, dl_remove(req->node)); +	    } +	} +    } +} + + +int main(int argc, char **argv) +{ +    char *vbi_name = NULL; +    int timeout = 0; +    char *fname = "ttext-%s.%e"; +    char *out_fmt = "ascii"; +    struct export *fmt = 0; +    int opt, ind; +    char *arg; +    struct vbi *vbi; +    struct req *req; +    struct dl_head reqs[2]; // simple linear lists of requests & captures +    int ttpid = -1; + +    setlocale (LC_CTYPE, ""); +    setprgname(argv[0]); + +    fdset_init(fds); +    dl_init(reqs); // the requests +    dl_init(reqs+1); // the captured pages + +    ind = 1; +    while (opt = option(argc, argv, &ind, &arg)) +	switch (opt) +	{ +            case 1: // charset +		if (streq(arg, "latin-1") || streq(arg, "1")) +		    latin1 = 1; +		else if (streq(arg, "latin-2") || streq(arg, "2")) +		    latin1 = 0; +		else if (streq(arg, "koi8-r") || streq(arg, "koi")) +		    latin1 = KOI8; +		else if (streq(arg, "iso8859-7") || streq(arg, "el")) +		    latin1 = GREEK; +		else +		    fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)"); +		break; +	    case 2: // format +		if (streq(arg, "help") || streq(arg, "?") || streq(arg, "list")) +		    exp_help(stdout); +		out_fmt = arg; +		fmt = 0; +		break; +	    case 3: // help +		usage(stdout, 0); +		break; +	    case 4: // name +		fname = arg; +		break; +	    case 5: // timeout +		timeout = strtol(arg, 0, 10); +		if (timeout < 1 || timeout > 999999) +		fatal("bad timeout value", timeout); +		break; +	    case 6: // service id +		sid = strtoul(arg, NULL, 0); +		break; +	    case 7: // teletext pid +		ttpid = strtoul(arg, NULL, 0); +		break; +	    case 8: // vbi +		vbi_name = arg; +		break; +	    case -1: // non-option arg +		if (not fmt) +		fmt = export_open(out_fmt); +		if (not fmt) +		fatal("%s", export_errstr()); +		if (not(req = malloc(sizeof(*req)))) +		out_of_mem(sizeof(*req)); +		req->name = fname; +		req->pgno_str = arg; +		req->pgno = arg_pgno(arg, &req->subno); +		req->export = fmt; +		dl_insert_last(reqs, req->node); +		break; +	} + +    if (dl_empty(reqs)) +	fatal("no pages requested"); + +    // setup device +    if (not(vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid))) +	fatal("cannot open %s", vbi_name); +    vbi_add_handler(vbi, event, reqs); // register event handler + +    if (timeout) +	alarm(timeout); + +    // capture pages (moves requests from reqs[0] to reqs[1]) +    while (not dl_empty(reqs) && not timed_out) +	if (fdset_select(fds, 30000) == 0) // 30sec select time out +	{ +	    error("no signal."); +	    break; +	} + +    alarm(0); +    vbi_del_handler(vbi, event, reqs); +    vbi_close(vbi); +    if (not dl_empty(reqs)) +	error("capture aborted. Some pages are missing."); + +    for (req = PTR reqs[1].first; req->node->next; req = PTR req->node->next) +    { +	fname = export_mkname(req->export, req->name, req->vtp, req->pgno_str); +	if (not fname || export(req->export, req->vtp, fname)) +	    error("error saving page %s: %s", req->pgno_str, export_errstr()); +	if (fname) +	    free(fname); +    } +    exit(dl_empty(reqs) ? 0 : 1); +} diff --git a/util/alevt/alevt-date.1 b/util/alevt/alevt-date.1 new file mode 100644 index 0000000..69d2f6f --- /dev/null +++ b/util/alevt/alevt-date.1 @@ -0,0 +1,41 @@ +.TH alevt-date 1 "February 07, 2010" +.SH NAME +alevt-date \- print out UTC date. +.SH SYNOPSIS +.B alevt-date +.RI [ options ] +.br +.SH DESCRIPTION +This manual page documents briefly the +.B alevt-date +commands. +.PP +\fBalevt-date\fP is a program to print the UTC date. +.SH OPTIONS +.TP +.B \-d -delta <max_secs> +maximum delta +.TP +.B \-f -format <fmtstr> +time format +.TP +.B \-h -help +print this page +.TP +.B \-s -set +set the system clock +.TP +.B \-t -timeout <seconds> +timeout +.TP +.B \-v -vbi <vbidev> +vbi device /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0 +.TP +.br +.SH SEE ALSO +.BR alevt-cap (1) , alevt (1). +.br +.SH AUTHOR +alevt-date was written by Edgar Toernig <froese@gmx.de>. +.PP +This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>. diff --git a/util/alevt/alevt-date.c b/util/alevt/alevt-date.c new file mode 100644 index 0000000..5496937 --- /dev/null +++ b/util/alevt/alevt-date.c @@ -0,0 +1,225 @@ +#include <stdio.h> +#include <string.h> +#include <sys/time.h> +#include <time.h> +#include <stdlib.h> +#include <unistd.h> +#include <signal.h> +#include "os.h" +#include "vt.h" +#include "fdset.h" +#include "vbi.h" +#include "lang.h" +#include "misc.h" + +char *fmt = "%a %b %d %H:%M:%S %Z %Y"; +int max_diff = 2*60*60; // default: 2 hours +int set_time = 0; +char *outfile = ""; +static char *channel; +u_int16_t sid; + + +static void chk_time(int t) +{ +    struct tm *tm; +    time_t sys_t; +    int dt; +    char buf[256]; + +    if (t < 0 || t > 235959 || t%100 > 59 || t/100%100 > 59) +    return; + +    sys_t = time(0); +    tm = localtime(&sys_t); + +    // Now convert to UTC seconds +    t = t/100/100 * 60*60 + t/100%100 * 60 + t%100; +#ifdef BSD +    t -= tm->tm_gmtoff; // dst already included... +#else +    t += timezone; +    if (tm->tm_isdst) +	t -= 60*60; +#endif + +    dt = t - sys_t % (24*60*60); +    if (dt <= -12*60*60) +	dt += 24*60*60; + +    if (dt <= -max_diff || dt >= max_diff) +	fatal("time diff too big (%2d:%02d:%02d)", dt/60/60, abs(dt)/60%60, abs(dt)%60); + +    sys_t += dt; + +    if (set_time) +    { +	struct timeval tv[1]; + +	tv->tv_sec = sys_t; +	tv->tv_usec = 500000; +	if (settimeofday(tv, 0) == -1) +	    ioerror("settimeofday"); +    } +    if (*fmt) +    { +	tm = localtime(&sys_t); +	if (strftime(buf, sizeof(buf), fmt, tm)) +	    puts(buf); +    } +    exit(0); +} + + +static void event(void *_, struct vt_event *ev) +{ +    switch (ev->type) +    { +	/* vbi may generate EV_PAGE, EV_HEADER, EV_XPACKET */ +	/* for event arguments see vt.h */ + +	case EV_HEADER: // a new title line (for running headers) +	{ +	    static int last_t = -1; +	    u8 *s = ev->p1; +	    int i, t = 1; + +	    if (ev->i2 & PG_OUTOFSEQ) +		break; + +	    for (i = 32; i < 40; ++i) +		if (s[i] >= '0' && s[i] <= '9') +		    t = t * 10+ s[i] - '0'; +	    if (t >= 1000000 && t <= 1235959) +		if (t == last_t || t - last_t == 1) +		    chk_time(t - 1000000); +	    last_t = t; +	    break; +	} +    } +} + + +static void usage(FILE *fp, int exit_val) +{ +    fprintf(fp, "usage: %s [options]\n", prgname); +    fprintf(fp, +	    "\n" +	    "  Valid options:\t\tDefault:\n" +	    "    -d -delta <max_secs>\t7200 (2 hours)\n" +	    "    -f -format <fmtstr>\t\t%%c\n" +	    "    -h -help\n" +	    "    -s -set\t\t\toff\n" +	    "    -to -timeout <seconds>\t(none)\n" +	    "    -v -vbi <vbidev>\t\t/dev/vbi\n" +		"                 \t\t/dev/vbi0\n" +		"                 \t\t/dev/video0\n" +		"                 \t\t/dev/dvb/adapter0/demux0\n" +	    ); +    exit(exit_val); +} + + +static int option(int argc, char **argv, int *ind, char **arg) +{ +    static struct { char *nam, *altnam; int arg; } opts[] = { +	{ "-delta", "-d", 1 }, +	{ "-format", "-f", 1 }, +	{ "-help", "-h", 0 }, +	{ "-set", "-s", 0 }, +	{ "-timeout", "-to", 1 }, +	{ "-vbi", "-v", 1 }, +    }; +    int i; + +    if (*ind >= argc) +	return 0; + +    *arg = argv[(*ind)++]; +    for (i = 0; i < NELEM(opts); ++i) +	if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam)) +	{ +	    if (opts[i].arg) +		if (*ind < argc) +		    *arg = argv[(*ind)++]; +		else +		    fatal("option %s requires an argument", *arg); +	    return i+1; +	} + +    if (**arg == '-') +    { +	fatal("%s: invalid option", *arg); +	usage(stderr, 1); +    } + +    return -1; +} + + +int main(int argc, char **argv) +{ +    char *vbi_name = NULL; +    int timeout = 0; +    struct vbi *vbi; +    int opt, ind; +    char *arg; +    int ttpid = -1; + +    setprgname(argv[0]); +    ind = 1; +    while (opt = option(argc, argv, &ind, &arg)) +	switch (opt) +	{ +	    case 1: // -delta +		max_diff = atoi(arg); +		if (max_diff < 1) +		    fatal("-delta: illegal value '%s'", arg); +		if (max_diff > 12*60*60) +		{ +		    max_diff = 12*60*60; +		    error("-delta: %d too big. Assuming %d", arg, max_diff); +		} +		break; +	    case 2: // -format +		fmt = arg; +		break; +	    case 3: // help +		usage(stdout, 0); +		break; +	    case 4: // -set +		set_time = 1; +		break; +	    case 5: // -timeout +		timeout = atoi(arg); +		if (timeout < 1 || timeout > 60*60) +		    fatal("-timeout: illegal value '%s'", arg); +		break; +	    case 6: // -vbi +		vbi_name = arg; +		break; +	    case -1: +		usage(stderr, 1); +		break; +	} + +    fdset_init(fds); + +    if (timeout) +    { +	signal(SIGALRM, SIG_DFL); // kill me +	alarm(timeout); +    } +    vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid); // open device +    if (not vbi) +	fatal_ioerror(vbi_name); +    vbi_add_handler(vbi, event, 0); // register event handler + +    for (;;) +	fdset_select(fds, -1); // call scheduler + +    /* never reached */ +    vbi_del_handler(vbi, event, 0); +    vbi_close(vbi); +    exit(0); +} diff --git a/util/alevt/alevt.1 b/util/alevt/alevt.1 new file mode 100644 index 0000000..68bff45 --- /dev/null +++ b/util/alevt/alevt.1 @@ -0,0 +1,60 @@ +.TH alevt 1 "February 07, 2010" +.SH NAME +alevt \- a teletext browser for analogue and DVB channels. +.SH SYNOPSIS +.B alevt +.RI [ options ] +.br +.SH DESCRIPTION +This manual page documents briefly the +.B alevt +commands. +.PP +\fBalevt\fP is a program to read teletext from analogue or DVB channels. +.SH OPTIONS +.TP +.B \-c <channel> +channel name (dvb only) +.TP +.B \-ch -child <ppp.ss> +child window +.TP +.B \-cs -charset <latin-1/2/koi8-r/iso8859-7> +character set +.TP +.B \-h -help +print this page +.TP +.B \-o <outfile> +path + file for all services (dvb only) +.TP +.B \-p -parent <ppp.ss> +parent window +.TP +.B \-s -sid <sid> +service id (dvb only) +.TP +.B \-t -ttpid <ttpid> +teletext pid (dvb only) +.TP +.B \-v -vbi <vbidev> +vbi device +.TP +Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0 +.TP +Order is important! Each page number opens a new window +with the previously given geometry, device, and display. +.TP +ppp.ss stands for a page number and an optional +subpage number (example: 123.4). +.TP +The -child option requires a parent window. So it must +be preceded by a parent or another child window. +.TP +.SH SEE ALSO +.BR alevt-cap (1), alevt-date (1). +.br +.SH AUTHOR +alevt was written by Edgar Toernig <froese@gmx.de>. +.PP +This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>. diff --git a/util/alevt/alevt.desktop b/util/alevt/alevt.desktop new file mode 100644 index 0000000..c125bb9 --- /dev/null +++ b/util/alevt/alevt.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=alevt +Comment=Teletext Browser +Exec=alevt +Icon=alevt +Terminal=false +Type=Application +Categories=GNOME;GTK;AudioVideo;Video; diff --git a/util/alevt/bdf2xbm.c b/util/alevt/bdf2xbm.c new file mode 100644 index 0000000..74d238e --- /dev/null +++ b/util/alevt/bdf2xbm.c @@ -0,0 +1,212 @@ +/* +    Simple program to convert a bdf-font to a bitmap. +    The characters are arranged in a 32x8 matrix. +    usage: bdf2xbm [identifier] <bdf >xbm +    Copyright 1998,1999 by E. Toernig (froese@gmx.de) +*/ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <ctype.h> +#include <stdarg.h> + +#define not ! +#define streq(a,b) (strcmp((a),(b)) == 0) + +int lineno; +char *word[64]; +int nword; + +char *font = "font%dx%d"; +int w, h, bpl; +unsigned char *bmap; + + +static void error(char *fmt, ...) +{ +    va_list args; + +    va_start(args, fmt); +    fprintf(stderr, "bdf2xbm"); +    if (lineno) +	fprintf(stderr, ":%d", lineno); +    fprintf(stderr, ": "); +    vfprintf(stderr, fmt, args); +    fputc('\n', stderr); +    exit(1); +} + + +static int nextline() +{ +    static char buf[256]; +    char *p; +    int i; + +    do +    { +	nword = 0; +	if (fgets(buf, sizeof(buf), stdin) == 0) +	    return nword; +	lineno++; +	 +	p = buf; +	for (;;) +	{ +	    while (isspace(*p)) +		p++; +	    if (*p == 0) +		break; +	    word[nword++] = p; +	    while (*p && not isspace(*p)) +		*p = toupper(*p), p++; +	    if (*p == 0) +		break; +	    *p++ = 0; +	} +    } while (nword == 0); + +    for (i = nword; i < 64; ++i) +	word[i] = ""; +    return nword; +} + + +static inline void setbit(int ch, int x, int y) +{ + +    int yo = ch / 32 * h + y; +    int xo = ch % 32 * w + x; + +    bmap[yo * bpl + xo / 8] |= 1 << (xo % 8); +} + + +static void dobitmap(int ch, int x, int y) +{ +    int i, j; + +    for (i = 0; i < y; ++i) +    { +	nextline(); +	if (nword > 1 || strlen(word[0]) != (x + 7) / 8 * 2) +	    error("bad BITMAP"); +	for (j = 0; j < x; ++j) +	{ +	    int c = word[0][j / 4]; +	    if (c >= '0' && c <= '9') +		c -= '0'; +	    else if (c >= 'A' && c <= 'F') +		c -= 'A' - 10; +	    else +		error("bad hexchar in BITMAP"); +	    if (c & (8 >> (j % 4))) +		setbit(ch, j, i); +	} +    } +} + + +static void dochar() +{ +    int ch = -1, x = -1,  y = -1; + +    while (nextline()) +    { +	if (streq(word[0], "ENDCHAR")) +	    return; +	else if (streq(word[0], "ENCODING") && nword == 2) +	{ +	    ch = atoi(word[1]); +	    if (ch < 0 || ch > 255) +		error("bad character code %d", ch); +	} +	else if (streq(word[0], "BBX") && nword == 5) +	{ +	    x = atoi(word[1]), y = atoi(word[2]); +	    if (x < 1 || x > 64 || y < 1 || y > 64) +		error("bad BBX (%dx%d)", x, y); +	} +	else if (streq(word[0], "BITMAP")) +	{ +	    if (x < 0) +		error("missing BBX"); +	    if (ch < 0) +		error("missing ENDCODING"); +	    dobitmap(ch, x, y); +	} +    } +    error("unexpected EOF (missing ENDCHAR)"); +} + + +static void dofile() +{ +    lineno = 0; +    w = h = 0; +    bmap = 0; + +    nextline(); +    if (nword != 2 || not streq(word[0], "STARTFONT")) +	error("not a bdf-file"); + +    while (nextline()) +    { +	if (streq(word[0], "ENDFONT")) +	    return; +	else if (streq(word[0], "FONTBOUNDINGBOX") && nword == 5) +	{ +	    if (bmap) +		error("multiple FONTBOUNDINGBOXes!?!"); +	    w = atoi(word[1]), h = atoi(word[2]); +	    if (w < 1 || w > 64 || h < 1 || h > 64) +		error("bad bounding box %dx%d\n", w, h); +	    bpl = (w*32+7)/8; // rounding is unnecessary +	    bmap = calloc(1, bpl * h*8); +	    if (bmap == 0) +		error("out of memory"); +	} +	else if (streq(word[0], "STARTCHAR")) +	{ +	    if (not bmap) +		error("no FONTBOUNDINGBOX"); +	    dochar(); +	} +    } +    error("unexpected EOF (missing ENDFONT)"); +} + + +static void writexbm() +{ +    char buf[256]; +    int i, j; +    unsigned char *p = bmap; + +    if (not bmap) +	return; + +    sprintf(buf, font, w, h); + +    printf("#define %s_width %d\n", buf, 32 * w); +    printf("#define %s_height %d\n", buf, 8 * h); +    printf("static unsigned char %s_bits[] = {\n", buf); +    for (i = 0; i < 16 * h * w / 8; ++i) +    { +	for (j = 0; j < 16; ++j) +	    printf("0x%02x,", *p++); +	printf("\n"); +    } +    printf("};\n"); +} + + +int main(int argc, char **argv) +{ +    if (argc > 1) +	font = argv[1]; +    dofile(); +    writexbm(); +    exit(0); +} diff --git a/util/alevt/cache.c b/util/alevt/cache.c new file mode 100644 index 0000000..c747448 --- /dev/null +++ b/util/alevt/cache.c @@ -0,0 +1,229 @@ +#include <stdlib.h> +#include <string.h> +#include "misc.h" +#include "dllist.h" +#include "cache.h" +#include "help.h" + + +static inline int hash(int pgno) +{ +    // very simple... +    return pgno % HASH_SIZE; +} + + +static void do_erc(struct vt_page *ovtp, struct vt_page *nvtp) +{ +    int l, c; + +    if (nvtp->errors == 0 && ovtp->lines == nvtp->lines) +	return; + +    for (l = 0; l < H; ++l) +    { +	if (~nvtp->lines & (1 << l)) +	    memcpy(nvtp->data[l], ovtp->data[l], W); +	else if (ovtp->lines & (1 << l)) +	    for (c = 0; c < W; ++c) +		if (nvtp->data[l][c] == BAD_CHAR) +		    nvtp->data[l][c] = ovtp->data[l][c]; +    } +    nvtp->lines |= ovtp->lines; +} + + +static void cache_close(struct cache *ca) +{ +    struct cache_page *cp; +    int i; + +    for (i = 0; i < HASH_SIZE; ++i) +	while (not dl_empty(ca->hash + i)) +	{ +	    cp = PTR ca->hash[i].first; +	    dl_remove(cp->node); +	    free(cp); +	} +    free(ca); +} + + +static void cache_reset(struct cache *ca) +{ +    struct cache_page *cp, *cpn; +    int i; + +    for (i = 0; i < HASH_SIZE; ++i) +	for (cp = PTR ca->hash[i].first; cpn = PTR cp->node->next; cp = cpn) +	    if (cp->page->pgno / 256 != 9) // don't remove help pages +	    { +		dl_remove(cp->node); +		free(cp); +		ca->npages--; +	    } +    memset(ca->hi_subno, 0, sizeof(ca->hi_subno[0]) * 0x900); +} + +/*  Get a page from the cache. +    If subno is SUB_ANY, the newest subpage of that page is returned */ + + +static struct vt_page * cache_get(struct cache *ca, int pgno, int subno) +{ +    struct cache_page *cp; +    int h = hash(pgno); + +    for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next) +	if (cp->page->pgno == pgno) +	    if (subno == ANY_SUB || cp->page->subno == subno) +	    { +		// found, move to front (make it 'new') +		dl_insert_first(ca->hash + h, dl_remove(cp->node)); +		return cp->page; +	    } +    return 0; +} + +/*  Put a page in the cache. +    If it's already there, it is updated. */ + + +static struct vt_page * cache_put(struct cache *ca, struct vt_page *vtp) +{ +    struct cache_page *cp; +    int h = hash(vtp->pgno); +     +    for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next) +	if (cp->page->pgno == vtp->pgno && cp->page->subno == vtp->subno) +	    break; + +    if (cp->node->next) +    { +	// move to front. +	dl_insert_first(ca->hash + h, dl_remove(cp->node)); +	if (ca->erc) +	    do_erc(cp->page, vtp); +    } +    else +    { +	cp = malloc(sizeof(*cp)); +	if (cp == 0) +	    return 0; +	if (vtp->subno >= ca->hi_subno[vtp->pgno]) +	    ca->hi_subno[vtp->pgno] = vtp->subno + 1; +	ca->npages++; +	dl_insert_first(ca->hash + h, cp->node); +    } + +    *cp->page = *vtp; +    return cp->page; +} + +/* Same as cache_get but doesn't make the found entry new */ + + +static struct vt_page * cache_lookup(struct cache *ca, int pgno, int subno) +{ +    struct cache_page *cp; +    int h = hash(pgno); + +    for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next) +	if (cp->page->pgno == pgno) +	    if (subno == ANY_SUB || cp->page->subno == subno) +		return cp->page; +    return 0; +} + + +static struct vt_page * cache_foreach_pg(struct cache *ca, int pgno, int subno, +    int dir, int (*func)(), void *data) +{ +    struct vt_page *vtp, *s_vtp = 0; + +    if (ca->npages == 0) +	return 0; + +    if (vtp = cache_lookup(ca, pgno, subno)) +	subno = vtp->subno; +    else if (subno == ANY_SUB) +	subno = dir < 0 ? 0 : 0xffff; + +    for (;;) +    { +	subno += dir; +	while (subno < 0 || subno >= ca->hi_subno[pgno]) +	{ +	    pgno += dir; +	    if (pgno < 0x100) +		pgno = 0x9ff; +	    if (pgno > 0x9ff) +		pgno = 0x100; +	    subno = dir < 0 ? ca->hi_subno[pgno] - 1 : 0; +	} +	if (vtp = cache_lookup(ca, pgno, subno)) +	{ +	    if (s_vtp == vtp) +		return 0; +	    if (s_vtp == 0) +		s_vtp = vtp; +	    if (func(data, vtp)) +		return vtp; +	} +    } +} + + +static int cache_mode(struct cache *ca, int mode, int arg) +{ +    int res = -1; + +    switch (mode) +    { +	case CACHE_MODE_ERC: +	    res = ca->erc; +	    ca->erc = arg ? 1 : 0; +	    break; +    } +    return res; +} + + +static struct cache_ops cops = +{ +    cache_close, +    cache_get, +    cache_put, +    cache_reset, +    cache_foreach_pg, +    cache_mode, +}; + + +struct cache * cache_open(void) +{ +    struct cache *ca; +    struct vt_page *vtp; +    int i; + +    if (not(ca = malloc(sizeof(*ca)))) +	goto fail1; + +    for (i = 0; i < HASH_SIZE; ++i) +	dl_init(ca->hash + i); + +    memset(ca->hi_subno, 0, sizeof(ca->hi_subno)); +    ca->erc = 1; +    ca->npages = 0; +    ca->op = &cops; + +    for (vtp = help_pages; vtp < help_pages + nr_help_pages; vtp++) +	cache_put(ca, vtp); + +    return ca; + +fail2: +    free(ca); +fail1: +    return 0; +} diff --git a/util/alevt/cache.h b/util/alevt/cache.h new file mode 100644 index 0000000..934ef9a --- /dev/null +++ b/util/alevt/cache.h @@ -0,0 +1,41 @@ +#ifndef CACHE_H +#define CACHE_H + +#include "vt.h" +#include "misc.h" +#include "dllist.h" + +#define HASH_SIZE 113 + + +struct cache +{ +    struct dl_head hash[HASH_SIZE]; +    int erc; // error reduction circuit on +    int npages; +    u16 hi_subno[0x9ff + 1]; // 0:pg not in cache, 1-3f80:highest subno + 1 +    struct cache_ops *op; +}; + + +struct cache_page +{ +    struct dl_node node[1]; +    struct vt_page page[1]; +}; + + +struct cache_ops +{ +    void (*close)(struct cache *ca); +    struct vt_page *(*get)(struct cache *ca, int pgno, int subno); +    struct vt_page *(*put)(struct cache *ca, struct vt_page *vtp); +    void (*reset)(struct cache *ca); +    struct vt_page *(*foreach_pg)(struct cache *ca, int pgno, int subno, int dir, +    int (*func)(), void *data); +    int (*mode)(struct cache *ca, int mode, int arg); +}; + +struct cache *cache_open(void); +#define CACHE_MODE_ERC 1 +#endif diff --git a/util/alevt/dllist.h b/util/alevt/dllist.h new file mode 100644 index 0000000..f925506 --- /dev/null +++ b/util/alevt/dllist.h @@ -0,0 +1,55 @@ +#ifndef DLLIST_H +#define DLLIST_H + + +struct dl_node +{ +    struct dl_node *next; +    struct dl_node *prev; +}; + + +struct dl_head +{ +    struct dl_node *first; +    struct dl_node *null; +    struct dl_node *last; +}; + + +static inline struct dl_head * dl_init(struct dl_head *h) +{ +    h->first = (struct dl_node *)&h->null; +    h->null = 0; +    h->last = (struct dl_node *)&h->first; +    return h; +} + + +static inline struct dl_node * dl_remove(struct dl_node *n) +{ +    n->prev->next = n->next; +    n->next->prev = n->prev; +    return n; +} + + +static inline struct dl_node * +    dl_insert_after(struct dl_node *p, struct dl_node *n) +{ +    n->next = p->next; +    n->prev = p; +    p->next = n; +    n->next->prev = n; +    return n; +} + +#define dl_empty(h)             ((h)->first->next == 0) +#define dl_insert_before(p, n)  dl_insert_after((p)->prev, (n)) +#define dl_insert_first(h, n)   ({ struct dl_node *_n = (n); \ +					dl_insert_before((h)->first, _n); }) +#define dl_insert_last(h, n)    ({ struct dl_node *_n = (n); \ +					dl_insert_after((h)->last, _n); }) +#define dl_remove_first(h)      dl_remove((h)->first) // mustn't be empty! +#define dl_remove_last(h)       dl_remove((h)->last) // mustn't be empty! +#endif diff --git a/util/alevt/exp-gfx.c b/util/alevt/exp-gfx.c new file mode 100644 index 0000000..82ab218 --- /dev/null +++ b/util/alevt/exp-gfx.c @@ -0,0 +1,258 @@ +/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "lang.h" +#include "export.h" +#include "font.h" +#define WW (W*CW) /* pixel width of window */ +#define WH (H*CH) /* pixel hegiht of window */ + + +static inline void draw_char(unsigned char * colour_matrix, int fg, int bg, +    int c, int dbl, int _x, int _y, int sep) +{ +  int x,y; +  unsigned char* src= (latin1==LATIN1 ? font1_bits : font2_bits); +  int dest_x=_x*CW; +  int dest_y=_y*CH; +       +  for(y=0;y<(CH<<dbl); y++) +    { +      for(x=0;x<CW; x++) +	{ +	  int bitnr, bit, maskbitnr, maskbit; +	  bitnr=(c/32*CH + (y>>dbl))*CW*32+ c%32*CW +x; +	  bit=(*(src+bitnr/8))&(1<<bitnr%8); +	  if (sep) +	    { +	      maskbitnr=(0xa0/32*CH + (y>>dbl))*CW*32+ 0xa0%32*CW +x; +	      maskbit=(*(src+maskbitnr/8))&(1<<maskbitnr%8); +	      *(colour_matrix+WW*(dest_y+y)+dest_x+x)= +		(char)((bit && (!maskbit)) ? fg : bg); +	    } +	  else  +	    *(colour_matrix+WW*(dest_y+y)+dest_x+x)= +	      (char)(bit ? fg : bg); +	} +    } +  return; +} + + +static void prepare_colour_matrix(/*struct export *e,*/ +		      struct fmt_page *pg,  +		      unsigned char *colour_matrix) +{ +   int x, y; +   for (y = 0; y < H; ++y) +	{ +	  for (x = 0; x < W; ++x) +	    {  +	      if (pg->dbl & (1<<(y-1))) +		{ +		  if (pg->data[y-1][x].attr & EA_HDOUBLE) +		     draw_char(colour_matrix, pg->data[y][x].fg,  +			    pg->data[y][x].bg, pg->data[y][x].ch,  +			    (0),  +			    x, y,  +			    ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0) +			    ); +		} +	      else +		{ +		  draw_char(colour_matrix, pg->data[y][x].fg,  +			    pg->data[y][x].bg, pg->data[y][x].ch,  +			    ((pg->data[y][x].attr & EA_DOUBLE) ? 1 : 0),  +			    x, y,  +			    ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0) +			    ); +		} +	    } +	} +    return; +} + + +static int ppm_output(struct export *e, char *name, struct fmt_page *pg); + +struct export_module export_ppm = // exported module definition +{ +    "ppm",			// id +    "ppm",			// extension +    0,				// options +    0,				// size +    0,				// open +    0,				// close +    0,				// option +    ppm_output			// output +}; + + +static int ppm_output(struct export *e, char *name, struct fmt_page *pg) +{ +  FILE *fp; +  long n; +  static u8 rgb1[][3]={{0,0,0}, +		      {1,0,0}, +		      {0,1,0}, +		      {1,1,0}, +		      {0,0,1}, +		      {1,0,1}, +		      {0,1,1}, +		      {1,1,1}}; +  unsigned char *colour_matrix; + +  if (!(colour_matrix=malloc(WH*WW)))  +    { +      export_error("cannot allocate memory"); +      return 0; +    } + +  prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix);  +  if (not(fp = fopen(name, "w"))) +    { +      free(colour_matrix); +      export_error("cannot create file"); +      return -1; +    } +  fprintf(fp,"P6 %d %d 1\n", WW, WH); + +  for(n=0;n<WH*WW;n++) +    { +      if (!fwrite(rgb1[(int) *(colour_matrix+n)], 3, 1, fp)) +	{ +	  export_error("error while writting to file"); +	  free(colour_matrix); +	  fclose(fp); +	  return -1; +	} +    } +  free(colour_matrix); +  fclose(fp); +  return 0; +} + + +#ifdef WITH_PNG + +#include <png.h> +static int png_open(struct export *e); +static int png_option(struct export *e, int opt, char *arg); +static int png_output(struct export *e, char *name, struct fmt_page *pg); +static char *png_opts[] =	// module options +{ +    "compression=<0-9>",	// set compression level +    0 +}; + +struct png_data			// private data in struct export +{ +    int compression; +}; + +struct export_module export_png =	// exported module definition +{ +    "png",			// id +    "png",			// extension +    png_opts,			// options +    sizeof(struct png_data),	// size +    png_open,			// open +    0,				// close +    png_option,			// option +    png_output			// output +}; + +#define D  ((struct png_data *)e->data) + + +static int png_open(struct export *e) +{ +    D->compression = Z_DEFAULT_COMPRESSION; +    return 0; +} + + +static int png_option(struct export *e, int opt, char *arg) +{ +    switch (opt) +    { +	case 1: // compression= +	    if (*arg >= '0' && *arg <= '9') +		D->compression = *arg - '0'; +	    break; +    } +    return 0; +} + + +static int png_output(struct export *e, char *name, struct fmt_page *pg) +{ +  FILE *fp; +  int x; +  png_structp png_ptr; +  png_infop info_ptr; +  png_byte *row_pointers[WH]; +  static u8 rgb8[][3]={{  0,  0,  0}, +		      {255,  0,  0}, +		      {  0,255,  0}, +		      {255,255,  0}, +		      {  0,  0,255}, +		      {255,  0,255}, +		      {  0,255,255}, +		      {255,255,255}}; +  unsigned char *colour_matrix; + +  if (!(colour_matrix=malloc(WH*WW)))  +    { +      export_error("cannot allocate memory"); +      return -1; +    } +  prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix);  +  if (not(fp = fopen(name, "w"))) +    { +      free(colour_matrix); +      export_error("cannot create file"); +      return -1; +      } +  png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,  +				    NULL, NULL, NULL); +  if (!png_ptr) +    { +      free(colour_matrix); +      fclose(fp); +      export_error("libpng init error"); +      return -1; +    } +  info_ptr = png_create_info_struct(png_ptr); +  if (!info_ptr) +    { +      png_destroy_write_struct(&png_ptr, +			       (png_infopp)NULL); +      free(colour_matrix); +      fclose(fp); +      export_error("libpng init error"); +      return -1; +    } +  png_init_io(png_ptr, fp); +  png_set_compression_level(png_ptr, D->compression); +  png_set_compression_mem_level(png_ptr, 9); +  png_set_compression_window_bits(png_ptr, 15); +  png_set_IHDR(png_ptr, info_ptr, WW, WH, +	       8, PNG_COLOR_TYPE_PALETTE , PNG_INTERLACE_NONE, +	       PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); +  png_set_PLTE(png_ptr, info_ptr,(png_color*) rgb8 , 8); +  png_write_info(png_ptr, info_ptr); +  for(x=0; x<WH; x++) +    { row_pointers[x]=colour_matrix+x*WW; } +  png_write_image(png_ptr, row_pointers); +  png_write_end(png_ptr, info_ptr); +  png_destroy_write_struct(&png_ptr, &info_ptr); +  free(colour_matrix); +  fclose(fp); +  return 0; +} + +#endif + diff --git a/util/alevt/exp-html.c b/util/alevt/exp-html.c new file mode 100644 index 0000000..6c9312a --- /dev/null +++ b/util/alevt/exp-html.c @@ -0,0 +1,299 @@ +/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */ + +#include <stdio.h> +#include <string.h> +#include "lang.h" +#include "export.h" + +static int html_open(struct export *e); +static int html_option(struct export *e, int opt, char *arg); +static int html_output(struct export *e, char *name, struct fmt_page *pg); +static char *html_opts[] = // module options +{ +  "gfx-chr=<char>",             // substitute <char> for gfx-symbols +  "bare",                     // no headers +   0 +}; + +struct html_data // private data in struct export +{ +  u8 gfx_chr; +  u8 bare; +}; + + +struct export_module export_html =	// exported module definition +{ +    "html",			// id +    "html",			// extension +    html_opts,			// options +    sizeof(struct html_data),	// size +    html_open,			// open +    0,				// close +    html_option,		// option +    html_output			// output +}; + +#define D  ((struct html_data *)e->data) + + +static int html_open(struct export *e) +{ +    D->gfx_chr = '#'; +    D->bare = 0; +    //e->reveal=1;	// the default should be the same for all formats. +    return 0; +} + + +static int html_option(struct export *e, int opt, char *arg) +{ +  switch (opt) +    { +    case 1: // gfx-chr= +      D->gfx_chr = *arg ?: ' '; +      break; +    case 2: // bare (no headers) +      D->bare=1; +      break; +    } +  return 0; +} + +#define HTML_BLACK   "#000000" +#define HTML_RED     "#FF0000" +#define HTML_GREEN   "#00FF00" +#define HTML_YELLOW  "#FFFF00" +#define HTML_BLUE    "#0000FF" +#define HTML_MAGENTA "#FF00FF" +#define HTML_CYAN    "#00FFFF" +#define HTML_WHITE   "#FFFFFF" + +#undef UNREADABLE_HTML //no '\n' +#define STRIPPED_HTML   //only necessary fields in header + +static int html_output(struct export *e, char *name, struct fmt_page *pg) +{ +     +  const char* html_colours[]={ HTML_BLACK, +			       HTML_RED, +			       HTML_GREEN, +			       HTML_YELLOW, +			       HTML_BLUE, +			       HTML_MAGENTA, +			       HTML_CYAN, +			       HTML_WHITE}; +  FILE *fp; +  int x, y; + +#ifdef UNREADABLE_HTML +#define HTML_NL +#else +#define HTML_NL fputc('\n',fp); +#endif +   +  if (not(fp = fopen(name, "w"))) +    { +      export_error("cannot create file"); +      return -1; +    } + +if (!D->bare) +  { +#ifndef STRIPPED_HTML   +    fputs("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">",fp); +    HTML_NL +#endif +      fputs("<html><head>",fp); +    HTML_NL +#ifndef STRIPPED_HTML +      fputs("<meta http-equiv=\"Content-Type\" content=\"text/html;",fp); +    switch(latin1) { +      case LATIN1: fprintf(fp,"charset=iso-8859-1\">"); break; +      case LATIN2: fprintf(fp,"charset=iso-8859-2\">"); break; +      case KOI8: fprintf(fp,"charset=koi8-r\">"); break; +      case GREEK: fprintf(fp,"charset=iso-8859-7\">"); break; +    } +    HTML_NL +      fputs("<meta name=\"GENERATOR\" content=\"alevt-cap\">",fp); +    HTML_NL +#else +    switch(latin1) { +      case LATIN1: fprintf(fp,"<meta charset=iso-8859-1\">"); break; +      case LATIN2: fprintf(fp,"<meta charset=iso-8859-2\">"); break; +      case KOI8: fprintf(fp,"<meta charset=koi8-r\">"); break; +      case GREEK: fprintf(fp,"<meta charset=iso-8859-7\">"); break; +    } +    HTML_NL +#endif +      fputs("</head>",fp); +    fputs("<body text=\"#FFFFFF\" bgcolor=\"#000000\">",fp); +    HTML_NL +      } //bare + +      fputs("<tt><b>",fp); +    HTML_NL + +  // write tables in form of HTML format +  for (y = 0; y < 25; ++y) +    {  +      int last_nonblank=0; +      int first_unprinted=0; +      int last_space=1; +      // previous char was   +      // is used for deciding to put semicolon or not +      int nbsp=0;  + +      // for output filled with ' ' up to 40 chars +      // set last_nonblank=39 +      for (x = 0 ; x < 40; ++x)  +	{  +	  if (pg->data[y][x].attr & EA_GRAPHIC) +	    {pg->data[y][x].ch= D->gfx_chr;} +	   +	  if (pg->data[y][x].ch!=' ') +	  { +	    last_nonblank=x; +	  } +	} + +      for (x = 0 ; x <= last_nonblank ; ++x) +	{ +	  if (pg->data[y][x].ch==' ') +	    { +	      // if single space between blinking/colour words +	      // then make the space blinking/colour too +	      if ((x)&&(x<39)) +		{ +		  if ((pg->data[y][x-1].ch!=' ') +		      &&(pg->data[y][x+1].ch!=' ') +		      &&(pg->data[y][x-1].attr & EA_BLINK) +		      &&(pg->data[y][x+1].attr & EA_BLINK)) +		    {pg->data[y][x].attr |= EA_BLINK;} +		  else 		     +		    {pg->data[y][x].attr &= ~EA_BLINK;} +		  	     +		  if ((pg->data[y][x-1].ch!=' ') +		      &&(pg->data[y][x+1].ch!=' ') +		      &&(pg->data[y][x-1].fg==pg->data[y][x+1].fg)) +		    {pg->data[y][x].fg=pg->data[y][x-1].fg;} +		  else +		    pg->data[y][x].fg=7; +		} +	      else +		{ +		  pg->data[y][x].attr &= ~EA_BLINK; +		  pg->data[y][x].fg=7; +		} +	    } +	  else +	    { +	      // if foreground is black set the foreground to previous  +	      // background colour to let it be visible +	      if (!pg->data[y][x].fg) +		{pg->data[y][x].fg=pg->data[y][x].bg;} +	    } +	  //check if attributes changed, +	  //if yes then print chars and update first_unprinted +	  //if not then go to next char +	  if (x) +	    { +	      if ((( +		    (pg->data[y][x].attr & EA_BLINK) +		    == +		    (pg->data[y][x-1].attr & EA_BLINK) +		    ) +		   && +		   ( +		    pg->data[y][x].fg == pg->data[y][x-1].fg +		    )) +		  &&(x!=last_nonblank)) +		 +		{ continue; } +	    } +	  else continue; +	     +	  { +	    int z=first_unprinted; +	    for(;(pg->data[y][z].ch==' ') && (z<x);z++) +	      { +		if (last_space) +		  { +		    fprintf(fp," "); +		    last_space=0; +		    nbsp=1; +		  } +		else  +		  { +		    fputc(' ',fp); +		    last_space=1; +		    nbsp=0; +		  } +	      } +	    +	    first_unprinted=z; +	     +	    if (z==x) continue;  +	     +	    if (pg->data[y][first_unprinted].attr & EA_BLINK)  +	      { +		fprintf(fp,"<blink>"); +		nbsp=0; +	      } +	     +	    if (pg->data[y][first_unprinted].fg!=7) +	      { +		fprintf(fp,"<font color=\"%s\">", +			html_colours[pg->data[y][first_unprinted].fg]); +		nbsp=0; +	      } +	    for(;(z<x)||(z==last_nonblank);z++) +	      { +		 +		if (pg->data[y][z].ch==' ') +		  { +		    for(;(pg->data[y][z].ch==' ') && (z<x);z++) +		      { +			if (last_space) +			  { +			    fprintf(fp," "); +			    last_space=0; +			    nbsp=1; +			  } +			else  +			  { +			    fputc(' ',fp); +			    last_space=1; +			    nbsp=0; +			  } +		      } +		    z--; +		  } +		else +		  { +		    //if previous nbsp --> put semicolon!!! +		    if (nbsp) fputc(';',fp); +		    fputc(pg->data[y][z].ch,fp); +		    last_space=0; +		    nbsp=0; +		  } +	      } +	    if (pg->data[y][first_unprinted].fg!=7) +	      { +		fprintf(fp,"</font>"); +	      } +	    if (pg->data[y][first_unprinted].attr & EA_BLINK) +	      fprintf(fp,"</blink>"); +	     +	    first_unprinted=z; +	  } +	} +      fputs("<br>",fp); +      HTML_NL +    } +  fputs("</b></tt>",fp); +  if (!D->bare) +    fputs("</body></html>",fp); +  fclose(fp); +  return 0; +} diff --git a/util/alevt/exp-txt.c b/util/alevt/exp-txt.c new file mode 100644 index 0000000..8009c17 --- /dev/null +++ b/util/alevt/exp-txt.c @@ -0,0 +1,226 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "os.h" +#include "export.h" + +static int txt_open(struct export *e); +static int txt_option(struct export *e, int opt, char *arg); +static int txt_output(struct export *e, char *name, struct fmt_page *pg); +static char *txt_opts[] =	// module options +{ +    "color",			// generate ansi color codes (and attributes) +    "gfx-chr=<char>",		// substitute <char> for gfx-symbols +    "fg=<0-7|none>",		// assume term has <x> as foreground color +    "bg=<0-7|none>",		// assume term has <x> as background color +    "lines=<1-25>",		// output 24 or 25 lines +    0 +}; + + +struct txt_data			// private data in struct export +{ +    u8 color; +    u8 gfx_chr; +    u8 def_fg; +    u8 def_bg; +    int endline; +    struct fmt_char curr[1]; +    FILE *fp; +}; + + +struct export_module export_txt =	// exported module definition +{ +    "ascii",			// id +    "txt",			// extension +    txt_opts,			// options +    sizeof(struct txt_data),	// data size +    txt_open,			// open +    0,				// close +    txt_option,			// option +    txt_output,			// output +}; + + +struct export_module export_ansi =	// exported module definition +{ +    "ansi",			// id +    "txt",			// extension +    txt_opts,			// options +    sizeof(struct txt_data),	// data size +    txt_open,			// open +    0,				// close +    txt_option,			// option +    txt_output,			// output +}; + +#define D  ((struct txt_data *)e->data) + + +char * my_stpcpy(char *dst, const char *src) +{ +    while (*dst = *src++) +	dst++; +    return dst; +} + + +static int txt_open(struct export *e) +{ +    D->gfx_chr = '#'; +    D->def_fg = -1; +    D->def_bg = -1; +    D->endline = H; +    if (e->mod == &export_ansi) +	D->color = 1; +    return 0; +} + + +static int txt_option(struct export *e, int opt, char *arg) +{ +    switch (opt) +    { +	case 1: // color +	    D->color = 1; +	    break; +	case 2: // gfx-chr= +	    D->gfx_chr = *arg ?: ' '; +	    break; +	case 3: // fg= +	    D->def_fg = *arg - '0'; +	    break; +	case 4: // bg= +	    D->def_bg = *arg - '0'; +	    break; +	case 5: // lines= +	    D->endline = atoi(arg); +	    if (D->endline < 1 || D->endline > H) +	    { +		export_error("lines: invalid number"); +		return 1; +	    } +    } +    return 0; +} + + +static void put_attr(struct export *e, struct fmt_char *new) +{ +    char buf[512]; +    char *p = buf; +    int fg, bg, attr; +    int reset = 0; + +    if (D->color) +    { +	fg = D->curr->fg ^ new->fg; +	bg = D->curr->bg ^ new->bg; +	attr = (D->curr->attr ^ new->attr) & (EA_BLINK | EA_DOUBLE); + +	if (fg | bg | attr) +	{ +	    if (~new->attr & attr)	// reset some attributes ->  reset all. +		reset = 1; +	    if (fg && new->fg == D->def_fg)	// switch to def fg -> reset all +		reset = 1; +	    if (bg && new->bg == D->def_bg)	// switch to def bg -> reset all +		reset = 1; + +	    p = my_stpcpy(buf, "\e["); +	    if (reset) +	    { +		p = my_stpcpy(p, ";");		// "0;" but 0 isn't neccesary +		attr = -1;			// set all attributes +		fg = new->fg ^ D->def_fg;	// set fg if != default fg +		bg = new->bg ^ D->def_bg;	// set bg if != default bg +	    } +	    if (attr & new->attr & EA_BLINK) +		p = my_stpcpy(p, "5;");			// blink +	    if (attr & new->attr & EA_DOUBLE) +		p = my_stpcpy(p, "1;");			// bold +	    if (fg) +		p += sprintf(p, "%d;", new->fg + 30);	// fg-color +	    if (bg) +		p += sprintf(p, "%d;", new->bg + 40);	// bg-color +	    p[-1] = 'm';	// replace last ; +	    *D->curr = *new; +	} +    } +    *p++ = new->ch; +    *p = 0; +    fputs(buf, D->fp); +} + + +static int txt_output(struct export *e, char *name, struct fmt_page *pg) +{ +    struct fmt_char def_c[1]; +    struct fmt_char l[W+2]; +    #define L (l+1) +    int x, y; + +    D->fp = fopen(name, "w"); +    if (not D->fp) +    { +	export_error("cannot create file"); +	return -1; +    } + +    /* initialize default colors. These have to be restored at EOL. */ +    def_c->ch = '\n'; +    def_c->fg = D->def_fg; +    def_c->bg = D->def_bg; +    def_c->attr = E_DEF_ATTR; +    *D->curr = *def_c; +    L[-1] = L[W] = *def_c; + +    for (y = 0; y < D->endline; y++) +	if (~pg->hid & (1 << y))	// not hidden +	{ +	    // character conversion +	    for (x = 0; x < W; ++x) +	    { +		struct fmt_char c = pg->data[y][x]; + +		switch (c.ch) +		{ +		    case 0x00: case 0xa0:		c.ch = ' '; break; +		    case 0x7f:				c.ch = '*'; break; +		    case BAD_CHAR:			c.ch = '?'; break; +		    default: +			if (c.attr & EA_GRAPHIC) +			    c.ch = D->gfx_chr; +			break; +		} +		L[x] = c; +	    } + +	    if (D->color) +	    { +		// optimize color and attribute changes +		// delay fg and attr changes as far as possible +		for (x = 0; x < W; ++x) +		    if (L[x].ch == ' ') +		    { +			L[x].fg = L[x-1].fg; +			l[x].attr = L[x-1].attr; +		    } + +		// move fg and attr changes to prev bg change point +		for (x = W-1; x >= 0; x--) +		    if (L[x].ch == ' ' && L[x].bg == L[x+1].bg) +		    { +			L[x].fg = L[x+1].fg; +			L[x].attr = L[x+1].attr; +		    } +	    } + +	    // now emit the whole line (incl EOL) +	    for (x = 0; x < W+1; ++x) +		put_attr(e, L + x); +	} +    fclose(D->fp); +    return 0; +} diff --git a/util/alevt/export.c b/util/alevt/export.c new file mode 100644 index 0000000..1eb8ea9 --- /dev/null +++ b/util/alevt/export.c @@ -0,0 +1,364 @@ +#include <stdarg.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "vt.h" +#include "misc.h" +#include "export.h" + +extern struct export_module export_txt; +extern struct export_module export_ansi; +extern struct export_module export_html; +extern struct export_module export_png; +extern struct export_module export_ppm; +struct export_module *modules[] = +{ +    &export_txt, +    &export_ansi, +    &export_html, +    &export_ppm, +#ifdef WITH_PNG +    &export_png, +#endif +    0 +}; + + +static char *glbl_opts[] = +{ +    "reveal",		// show hidden text +    "hide",		// don't show hidden text (default) +    0 +}; + +static char errbuf[64]; + + +void export_error(char *str, ...) +{ +    va_list args; + +    va_start(args, str); +    vsnprintf(errbuf, sizeof(errbuf)-1, str, args); +} + + +char * export_errstr(void) +{ +    return errbuf; +} + + +static int find_opt(char **opts, char *opt, char *arg) +{ +    int err = 0; +    char buf[256]; +    char **oo, *o, *a; + +    if (oo = opts) +	while (o = *oo++) +	{ +	    if (a = strchr(o, '=')) +	    { +		a = buf + (a - o); +		o = strcpy(buf, o); +		*a++ = 0; +	    } +	    if (strcasecmp(o, opt) == 0) +	    { +		if ((a != 0) == (arg != 0)) +		    return oo - opts; +		err = -1; +	    } +	} +    return err; +} + + +struct export * export_open(char *fmt) +{ +    struct export_module **eem, *em; +    struct export *e; +    char *opt, *optend, *optarg; +    int opti; + +    if (fmt = strdup(fmt)) +    { +	if (opt = strchr(fmt, ',')) +	    *opt++ = 0; +	for (eem = modules; em = *eem; eem++) +	    if (strcasecmp(em->fmt_name, fmt) == 0) +		break; +	if (em) +	{ +	    if (e = malloc(sizeof(*e) + em->local_size)) +	    { +		e->mod = em; +		e->fmt_str = fmt; +		e->reveal = 0; +		memset(e + 1, 0, em->local_size); +		if (not em->open || em->open(e) == 0) +		{ +		    for (; opt; opt = optend) +		    { +			if (optend = strchr(opt, ',')) +			    *optend++ = 0; +			if (not *opt) +			    continue; +			if (optarg = strchr(opt, '=')) +			    *optarg++ = 0; +			if ((opti = find_opt(glbl_opts, opt, optarg)) > 0) +			{ +			    if (opti == 1) // reveal +				e->reveal = 1; +			    else if (opti == 2) // hide +				e->reveal = 0; +			} +			else if (opti == 0 && +				(opti = find_opt(em->options, opt, optarg)) > 0) +			{ +			    if (em->option(e, opti, optarg)) +				break; +			} +			else +			{ +			    if (opti == 0) +				export_error("%s: unknown option", opt); +			    else if (optarg) +				export_error("%s: takes no arg", opt); +			    else +				export_error("%s: missing arg", opt); +			    break; +			} +		    } +		    if (opt == 0) +			return e; + +		    if (em->close) +			em->close(e); +		} +		free(e); +	    } +	    else +		export_error("out of memory"); +	} +	else +	    export_error("unknown format: %s", fmt); +	free(fmt); +    } +    else +	export_error("out of memory"); +    return 0; +} + + +void export_close(struct export *e) +{ +    if (e->mod->close) +	e->mod->close(e); +    free(e->fmt_str); +    free(e); +} + + +static char * hexnum(char *buf, unsigned int num) +{ +    char *p = buf + 5; + +    num &= 0xffff; +    *--p = 0; +    do +    { +	*--p = "0123456789abcdef"[num % 16]; +	num /= 16; +    } while (num); +    return p; +} + + +static char * adjust(char *p, char *str, char fill, int width) +{ +    int l = width - strlen(str); + +    while (l-- > 0) +	*p++ = fill; +    while (*p = *str++) +	p++; +    return p; +} + + +char * export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr) +{ +    char bbuf[1024]; +    char *p = bbuf; + +    while (*p = *fmt++) +	if (*p++ == '%') +	{ +	    char buf[32], buf2[32]; +	    int width = 0; + +	    p--; +	    while (*fmt >= '0' && *fmt <= '9') +		width = width*10 + *fmt++ - '0'; + +	    switch (*fmt++) +	    { +		case '%': +		    p = adjust(p, "%", '%', width); +		    break; +		case 'e':	// extension +		    p = adjust(p, e->mod->extension, '.', width); +		    break; +		case 'p':	// pageno[.subno] +		    if (vtp->subno) +			p = adjust(p,strcat(strcat(hexnum(buf, vtp->pgno), +				"."), hexnum(buf2, vtp->subno)), ' ', width); +		    else +			p = adjust(p, hexnum(buf, vtp->pgno), ' ', width); +		    break; +		case 'S':	// subno +		    p = adjust(p, hexnum(buf, vtp->subno), '0', width); +		    break; +		case 'P':	// pgno +		    p = adjust(p, hexnum(buf, vtp->pgno), '0', width); +		    break; +		case 's':	// user strin +		    p = adjust(p, usr, ' ', width); +		    break; +		//TODO: add date, channel name, ... +	    } +	} +    p = strdup(bbuf); +    if (not p) +	export_error("out of memory"); +    return p; +} + + +static void fmt_page(struct export *e, struct fmt_page *pg, struct vt_page *vtp) +{ +    char buf[16]; +    int x, y; +    u8 *p = vtp->data[0]; + +    pg->dbl = 0; + +    sprintf(buf, "\2%x.%02x\7", vtp->pgno, vtp->subno & 0xff); + +    for (y = 0; y < H; y++) +    { +	struct fmt_char c; +	int last_ch = ' '; +	int dbl = 0, hold = 0; + +	c.fg = 7; +	c.bg = 0; +	c.attr = 0; + +	for (x = 0; x < W; ++x) +	{ +	    c.ch = *p++; +	    if (y == 0 && x < 8) +		c.ch = buf[x]; +	    switch (c.ch) +	    { +		case 0x00 ... 0x07:	/* alpha + fg color */ +		    c.fg = c.ch & 7; +		    c.attr &= ~(EA_GRAPHIC | EA_CONCEALED); +		    goto ctrl; +		case 0x08:		/* flash */ +		    c.attr |= EA_BLINK; +		    goto ctrl; +		case 0x09:		/* steady */ +		    c.attr &= ~EA_BLINK; +		    goto ctrl; +		case 0x0a:		/* end box */ +		case 0x0b:		/* start box */ +		    goto ctrl; +		case 0x0c:		/* normal height */ +		    c.attr &= EA_DOUBLE; +		    goto ctrl; +		case 0x0d:		/* double height */ +		    if (y < H-2)	/* ignored on last 2 lines */ +		    { +			c.attr |= EA_DOUBLE; +			dbl = 1; +		    } +		    goto ctrl; +		case 0x10 ... 0x17:	/* gfx + fg color */ +		    c.fg = c.ch & 7; +		    c.attr |= EA_GRAPHIC; +		    c.attr &= ~EA_CONCEALED; +		    goto ctrl; +		case 0x18:		/* conceal */ +		    c.attr |= EA_CONCEALED; +		    goto ctrl; +		case 0x19:		/* contiguous gfx */ +		    c.attr &= ~EA_SEPARATED; +		    goto ctrl; +		case 0x1a:		/* separate gfx */ +		    c.attr |= EA_SEPARATED; +		    goto ctrl; +		case 0x1c:		/* black bg */ +		    c.bg = 0; +		    goto ctrl; +		case 0x1d:		/* new bg */ +		    c.bg = c.fg; +		    goto ctrl; +		case 0x1e:		/* hold gfx */ +		    hold = 1; +		    goto ctrl; +		case 0x1f:		/* release gfx */ +		    hold = 0; +		    goto ctrl; + +		case 0x0e:		/* SO */ +		case 0x0f:		/* SI */ +		case 0x1b:		/* ESC */ +		    c.ch = ' '; +		    break; + +		ctrl: +		    c.ch = ' '; +		    if (hold && (c.attr & EA_GRAPHIC)) +			c.ch = last_ch; +		    break; +	    } +	    if (c.attr & EA_GRAPHIC) +		if ((c.ch & 0xa0) == 0x20) +		{ +		    last_ch = c.ch; +		    c.ch += (c.ch & 0x40) ? 32 : -32; +		} +	    if (c.attr & EA_CONCEALED) +		if (not e->reveal) +		    c.ch = ' '; +	    pg->data[y][x] = c; +	} +	if (dbl) +	{ +	    pg->dbl |= 1 << y; +	    for (x = 0; x < W; ++x) +	    { +		if (~pg->data[y][x].attr & EA_DOUBLE) +		    pg->data[y][x].attr |= EA_HDOUBLE; +		pg->data[y+1][x] = pg->data[y][x]; +		pg->data[y+1][x].ch = ' '; +	    } +	    y++; +	    p += W; +	} +    } +    pg->hid = pg->dbl << 1; +} + + +int export(struct export *e, struct vt_page *vtp, char *name) +{ +    struct fmt_page pg[1]; + +    fmt_page(e, pg, vtp); +    return e->mod->output(e, name, pg); +} diff --git a/util/alevt/export.h b/util/alevt/export.h new file mode 100644 index 0000000..a08875c --- /dev/null +++ b/util/alevt/export.h @@ -0,0 +1,66 @@ +#ifndef EXPORT_H +#define EXPORT_H + +#include "vt.h" +#include "misc.h" + + +struct fmt_char +{ +    u8 ch, fg, bg, attr; +}; + +#define EA_DOUBLE	1	// double height char +#define EA_HDOUBLE	2	// single height char in double height line +#define EA_BLINK	4	// blink +#define EA_CONCEALED	8	// concealed +#define EA_GRAPHIC	16	// graphic symbol +#define EA_SEPARATED	32	// use separated graphic symbol + +#define E_DEF_FG	7 +#define E_DEF_BG	0 +#define E_DEF_ATTR	0 + + +struct fmt_page +{ +    struct vt_page *vtp; +    u32 dbl, hid; +    struct fmt_char data[H][W]; +}; + + +struct export +{ +    struct export_module *mod;	// module type +    char *fmt_str;		// saved option string (splitted) +    // global options +    int reveal;			// reveal hidden chars +    // local data for module's use.  initialized to 0. +    struct { int dummy; } data[0]; +}; + + +struct export_module +{ +    char *fmt_name;		// the format type name (ASCII/HTML/PNG/...) +    char *extension;		// the default file name extension +    char **options;		// module options +    int local_size; +    int (*open)(struct export *fmt); +    void (*close)(struct export *fmt); +    int (*option)(struct export *fmt, int opt, char *arg); +    int (*output)(struct export *fmt, char *name, struct fmt_page *pg); +}; + + +extern struct export_module *modules[];	// list of modules (for help msgs) +void export_error(char *str, ...);	// set error +char *export_errstr(void);		// return last error +char *export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr); + + +struct export *export_open(char *fmt); +void export_close(struct export *e); +int export(struct export *e, struct vt_page *vtp, char *user_str); +#endif diff --git a/util/alevt/fdset.c b/util/alevt/fdset.c new file mode 100644 index 0000000..99edac4 --- /dev/null +++ b/util/alevt/fdset.c @@ -0,0 +1,97 @@ +#include <stdlib.h> +#include <unistd.h> +#include <sys/time.h> +#include "dllist.h" +#include "misc.h" +#include "fdset.h" + +struct fdset fds[1];		/* global fd list */ + + +int fdset_init(struct fdset *fds) +{ +    dl_init(fds->list); +    fds->del_count = 0; +    return 0; +} + + +int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data) +{ +    struct fdset_node *fn; + +    if (fd < 0) +	return -1; +    if (handler == 0) +	return -1; + +    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next) +	if (fn->fd == fd) +	    return -1; + +    if (not(fn = malloc(sizeof(*fn)))) +	return -1; +    fn->fd = fd; +    fn->handler = handler; +    fn->data = data; +    dl_insert_last(fds->list, fn->node); +    return 0; +} + + +int fdset_del_fd(struct fdset *fds, int fd) +{ +    struct fdset_node *fn; + +    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next) +	if (fn->fd == fd) +	{ +	    dl_remove(fn->node); +	    free(fn); +	    fds->del_count++; +	    return 0; +	} +    return -1; +} + + +int fdset_select(struct fdset *fds, int timeout) +{ +    struct fdset_node *fn; +    fd_set rfds[1]; +    struct timeval tv[1], *tvp = 0; +    int max_fd, x, del_count; + +    FD_ZERO(rfds); +    max_fd = 0; +    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next) +    { +	FD_SET(fn->fd, rfds); +	if (fn->fd >= max_fd) +	    max_fd = fn->fd + 1; +    } + +    if (timeout >= 0) +    { +	tv->tv_sec = timeout/1000; +	tv->tv_usec = timeout%1000*1000; +	tvp = tv; +    } + +    x = select(max_fd, rfds, 0, 0, tvp); +    if (x <= 0) +	return x; + +    /* A little bit complicated. A called handler may modify the fdset... */ +restart: +    del_count = fds->del_count; +    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next) +	if (FD_ISSET(fn->fd, rfds)) +	{ +	    FD_CLR(fn->fd, rfds); +	    fn->handler(fn->data, fn->fd); +	    if (fds->del_count != del_count) +		goto restart; +	} +    return 1; +} diff --git a/util/alevt/fdset.h b/util/alevt/fdset.h new file mode 100644 index 0000000..4b786e6 --- /dev/null +++ b/util/alevt/fdset.h @@ -0,0 +1,28 @@ +#ifndef FDSET_H +#define FDSET_H + +#include "dllist.h" + + +struct fdset +{ +    struct dl_head list[1]; +    int del_count; +}; + + +struct fdset_node /*internal*/ +{ +    struct dl_node node[1]; +    int fd; +    void (*handler)(void *data, int fd); +    void *data; +}; + +extern struct fdset fds[1]; /* global fd list */ + +int fdset_init(struct fdset *fds); +int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data); +int fdset_del_fd(struct fdset *fds, int fd); +int fdset_select(struct fdset *fds, int timeout /*millisec*/); +#endif diff --git a/util/alevt/font.c b/util/alevt/font.c new file mode 100644 index 0000000..da0e448 --- /dev/null +++ b/util/alevt/font.c @@ -0,0 +1,5 @@ +#define static /* I want them global */ +#include "font1.xbm" +#include "font2.xbm" +#include "font3.xbm" +#include "font4.xbm" diff --git a/util/alevt/font.h b/util/alevt/font.h new file mode 100644 index 0000000..c17c4bc --- /dev/null +++ b/util/alevt/font.h @@ -0,0 +1,19 @@ +#ifndef FONT_H +#define FONT_H + +#include "fontsize.h" /* the #defines from font?.xbm */ + +#if font1_width != font2_width || font1_height != font2_height +#error different font sizes. +#endif + +extern unsigned char font1_bits[]; +extern unsigned char font2_bits[]; +extern unsigned char font3_bits[]; +extern unsigned char font4_bits[]; + +#define font_width font1_width +#define font_height font1_height +#define CW (font_width/32) /* pixel width of a character */ +#define CH (font_height/8) /* pixel height of a character */ +#endif diff --git a/util/alevt/hamm.c b/util/alevt/hamm.c new file mode 100644 index 0000000..c44a902 --- /dev/null +++ b/util/alevt/hamm.c @@ -0,0 +1,229 @@ +#include "vt.h" +#include "hamm.h" + +// table to decode hamm8/4 encoded bytes. +// the low 4 bits are the (corrected) data bits +// bit 8 is set if there was a single bit error +// bit 12 is set if there was an uncorrectable error + +// the idea: you may add up to 15 words and get the +// number of single bit errors in b8-b11 and the number +// of double errors in b12-b15 + + +static unsigned short hammtab[256] = +{ +    0x0101, 0x100f, 0x0001, 0x0101, 0x100f, 0x0100, 0x0101, 0x100f, +    0x100f, 0x0102, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107, +    0x100f, 0x0100, 0x0101, 0x100f, 0x0100, 0x0000, 0x100f, 0x0100, +    0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x0103, 0x100f, +    0x100f, 0x010c, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107, +    0x0106, 0x100f, 0x100f, 0x0107, 0x100f, 0x0107, 0x0107, 0x0007, +    0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x010d, 0x100f, +    0x0006, 0x0106, 0x0106, 0x100f, 0x0106, 0x100f, 0x100f, 0x0107, +    0x100f, 0x0102, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109, +    0x0102, 0x0002, 0x100f, 0x0102, 0x100f, 0x0102, 0x0103, 0x100f, +    0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x0103, 0x100f, +    0x100f, 0x0102, 0x0103, 0x100f, 0x0103, 0x100f, 0x0003, 0x0103, +    0x0104, 0x100f, 0x100f, 0x0105, 0x0004, 0x0104, 0x0104, 0x100f, +    0x100f, 0x0102, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107, +    0x100f, 0x0105, 0x0105, 0x0005, 0x0104, 0x100f, 0x100f, 0x0105, +    0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x0103, 0x100f, +    0x100f, 0x010c, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109, +    0x010a, 0x100f, 0x100f, 0x010b, 0x000a, 0x010a, 0x010a, 0x100f, +    0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x010d, 0x100f, +    0x100f, 0x010b, 0x010b, 0x000b, 0x010a, 0x100f, 0x100f, 0x010b, +    0x010c, 0x000c, 0x100f, 0x010c, 0x100f, 0x010c, 0x010d, 0x100f, +    0x100f, 0x010c, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107, +    0x100f, 0x010c, 0x010d, 0x100f, 0x010d, 0x100f, 0x000d, 0x010d, +    0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x010d, 0x100f, +    0x0108, 0x100f, 0x100f, 0x0109, 0x100f, 0x0109, 0x0109, 0x0009, +    0x100f, 0x0102, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109, +    0x0008, 0x0108, 0x0108, 0x100f, 0x0108, 0x100f, 0x100f, 0x0109, +    0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x0103, 0x100f, +    0x100f, 0x010c, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109, +    0x010f, 0x100f, 0x000f, 0x010f, 0x100f, 0x010e, 0x010f, 0x100f, +    0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x010d, 0x100f, +    0x100f, 0x010e, 0x010f, 0x100f, 0x010e, 0x000e, 0x100f, 0x010e, +}; + +#if 0	// this information is contained in hamm24par bit 5 +// simple parity table (sum of 1 bits modulo 2) + + +static char odd_parity[256] = +{ +    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, +    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, +    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, +    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, +    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, +    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, +    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, +    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, +    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, +    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, +    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, +    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, +    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, +    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, +    1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, +    0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 +}; +#endif + +// this table generates the parity checks for hamm24/18 decoding. +// bit 0 is for test A, 1 for B, ... +// thanks to R. Gancarz for this fine table *g* + + +static char hamm24par[3][256] = +{ +    { // parities of first byte +	 0, 33, 34,  3, 35,  2,  1, 32, 36,  5,  6, 39,  7, 38, 37,  4, +	37,  4,  7, 38,  6, 39, 36,  5,  1, 32, 35,  2, 34,  3,  0, 33, +	38,  7,  4, 37,  5, 36, 39,  6,  2, 35, 32,  1, 33,  0,  3, 34, +	 3, 34, 33,  0, 32,  1,  2, 35, 39,  6,  5, 36,  4, 37, 38,  7, +	39,  6,  5, 36,  4, 37, 38,  7,  3, 34, 33,  0, 32,  1,  2, 35, +	 2, 35, 32,  1, 33,  0,  3, 34, 38,  7,  4, 37,  5, 36, 39,  6, +	 1, 32, 35,  2, 34,  3,  0, 33, 37,  4,  7, 38,  6, 39, 36,  5, +	36,  5,  6, 39,  7, 38, 37,  4,  0, 33, 34,  3, 35,  2,  1, 32, +	40,  9, 10, 43, 11, 42, 41,  8, 12, 45, 46, 15, 47, 14, 13, 44, +	13, 44, 47, 14, 46, 15, 12, 45, 41,  8, 11, 42, 10, 43, 40,  9, +	14, 47, 44, 13, 45, 12, 15, 46, 42, 11,  8, 41,  9, 40, 43, 10, +	43, 10,  9, 40,  8, 41, 42, 11, 15, 46, 45, 12, 44, 13, 14, 47, +	15, 46, 45, 12, 44, 13, 14, 47, 43, 10,  9, 40,  8, 41, 42, 11, +	42, 11,  8, 41,  9, 40, 43, 10, 14, 47, 44, 13, 45, 12, 15, 46, +	41,  8, 11, 42, 10, 43, 40,  9, 13, 44, 47, 14, 46, 15, 12, 45, +	12, 45, 46, 15, 47, 14, 13, 44, 40,  9, 10, 43, 11, 42, 41,  8 +    }, { // parities of second byte +	 0, 41, 42,  3, 43,  2,  1, 40, 44,  5,  6, 47,  7, 46, 45,  4, +	45,  4,  7, 46,  6, 47, 44,  5,  1, 40, 43,  2, 42,  3,  0, 41, +	46,  7,  4, 45,  5, 44, 47,  6,  2, 43, 40,  1, 41,  0,  3, 42, +	 3, 42, 41,  0, 40,  1,  2, 43, 47,  6,  5, 44,  4, 45, 46,  7, +	47,  6,  5, 44,  4, 45, 46,  7,  3, 42, 41,  0, 40,  1,  2, 43, +	 2, 43, 40,  1, 41,  0,  3, 42, 46,  7,  4, 45,  5, 44, 47,  6, +	 1, 40, 43,  2, 42,  3,  0, 41, 45,  4,  7, 46,  6, 47, 44,  5, +	44,  5,  6, 47,  7, 46, 45,  4,  0, 41, 42,  3, 43,  2,  1, 40, +	48, 25, 26, 51, 27, 50, 49, 24, 28, 53, 54, 31, 55, 30, 29, 52, +	29, 52, 55, 30, 54, 31, 28, 53, 49, 24, 27, 50, 26, 51, 48, 25, +	30, 55, 52, 29, 53, 28, 31, 54, 50, 27, 24, 49, 25, 48, 51, 26, +	51, 26, 25, 48, 24, 49, 50, 27, 31, 54, 53, 28, 52, 29, 30, 55, +	31, 54, 53, 28, 52, 29, 30, 55, 51, 26, 25, 48, 24, 49, 50, 27, +	50, 27, 24, 49, 25, 48, 51, 26, 30, 55, 52, 29, 53, 28, 31, 54, +	49, 24, 27, 50, 26, 51, 48, 25, 29, 52, 55, 30, 54, 31, 28, 53, +	28, 53, 54, 31, 55, 30, 29, 52, 48, 25, 26, 51, 27, 50, 49, 24 +    }, { // parities of third byte +	63, 14, 13, 60, 12, 61, 62, 15, 11, 58, 57,  8, 56,  9, 10, 59, +	10, 59, 56,  9, 57,  8, 11, 58, 62, 15, 12, 61, 13, 60, 63, 14, +	 9, 56, 59, 10, 58, 11,  8, 57, 61, 12, 15, 62, 14, 63, 60, 13, +	60, 13, 14, 63, 15, 62, 61, 12,  8, 57, 58, 11, 59, 10,  9, 56, +	 8, 57, 58, 11, 59, 10,  9, 56, 60, 13, 14, 63, 15, 62, 61, 12, +	61, 12, 15, 62, 14, 63, 60, 13,  9, 56, 59, 10, 58, 11,  8, 57, +	62, 15, 12, 61, 13, 60, 63, 14, 10, 59, 56,  9, 57,  8, 11, 58, +	11, 58, 57,  8, 56,  9, 10, 59, 63, 14, 13, 60, 12, 61, 62, 15, +	31, 46, 45, 28, 44, 29, 30, 47, 43, 26, 25, 40, 24, 41, 42, 27, +	42, 27, 24, 41, 25, 40, 43, 26, 30, 47, 44, 29, 45, 28, 31, 46, +	41, 24, 27, 42, 26, 43, 40, 25, 29, 44, 47, 30, 46, 31, 28, 45, +	28, 45, 46, 31, 47, 30, 29, 44, 40, 25, 26, 43, 27, 42, 41, 24, +	40, 25, 26, 43, 27, 42, 41, 24, 28, 45, 46, 31, 47, 30, 29, 44, +	29, 44, 47, 30, 46, 31, 28, 45, 41, 24, 27, 42, 26, 43, 40, 25, +	30, 47, 44, 29, 45, 28, 31, 46, 42, 27, 24, 41, 25, 40, 43, 26, +	43, 26, 25, 40, 24, 41, 42, 27, 31, 46, 45, 28, 44, 29, 30, 47 +    } +}; + +// table to extract the lower 4 bit from hamm24/18 encoded bytes + + +static char hamm24val[256] = +{ +      0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1, +      2,  2,  2,  2,  3,  3,  3,  3,  2,  2,  2,  2,  3,  3,  3,  3, +      4,  4,  4,  4,  5,  5,  5,  5,  4,  4,  4,  4,  5,  5,  5,  5, +      6,  6,  6,  6,  7,  7,  7,  7,  6,  6,  6,  6,  7,  7,  7,  7, +      8,  8,  8,  8,  9,  9,  9,  9,  8,  8,  8,  8,  9,  9,  9,  9, +     10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11, +     12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, +     14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15, +      0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1, +      2,  2,  2,  2,  3,  3,  3,  3,  2,  2,  2,  2,  3,  3,  3,  3, +      4,  4,  4,  4,  5,  5,  5,  5,  4,  4,  4,  4,  5,  5,  5,  5, +      6,  6,  6,  6,  7,  7,  7,  7,  6,  6,  6,  6,  7,  7,  7,  7, +      8,  8,  8,  8,  9,  9,  9,  9,  8,  8,  8,  8,  9,  9,  9,  9, +     10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11, +     12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, +     14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15 +}; + +// mapping from parity checks made by table hamm24par to error +// results return by hamm24. +// (0 = no error, 0x0100 = single bit error, 0x1000 = double error) + + +static short hamm24err[64] = +{ +    0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, +    0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, +    0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, +    0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, +    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, +    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, +    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, +    0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, +}; + +// mapping from parity checks made by table hamm24par to faulty bit +// in the decoded 18 bit word. + + +static int hamm24cor[64] = +{ +    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, +    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, +    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, +    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, +    0x00000, 0x00000, 0x00000, 0x00001, 0x00000, 0x00002, 0x00004, 0x00008, +    0x00000, 0x00010, 0x00020, 0x00040, 0x00080, 0x00100, 0x00200, 0x00400, +    0x00000, 0x00800, 0x01000, 0x02000, 0x04000, 0x08000, 0x10000, 0x20000, +    0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, +}; + + +int hamm8(u8 *p, int *err) +{ +    int a = hammtab[p[0]]; +    *err += a; +    return a & 15; +} + + +int hamm16(u8 *p, int *err) +{ +    int a = hammtab[p[0]]; +    int b = hammtab[p[1]]; +    *err += a; +    *err += b; +    return (a & 15) | (b & 15) * 16; +} + + +int hamm24(u8 *p, int *err) +{ +    int e = hamm24par[0][p[0]] ^ hamm24par[1][p[1]] ^ hamm24par[2][p[2]]; +    int x = hamm24val[p[0]] + p[1] % 128 * 16 + p[2] % 128 * 2048; +    *err += hamm24err[e]; +    return x ^ hamm24cor[e]; +} + + +int chk_parity(u8 *p, int n) +{ +    int err; +    for (err = 0; n--; p++) +	if (hamm24par[0][*p] & 32) +	    *p &= 0x7f; +	else +	    *p = BAD_CHAR, err++; +    return err; +} diff --git a/util/alevt/hamm.h b/util/alevt/hamm.h new file mode 100644 index 0000000..3b8c8ad --- /dev/null +++ b/util/alevt/hamm.h @@ -0,0 +1,7 @@ +#ifndef HAMM_H +#define HAMM_H +int hamm8(u8 *p, int *err); +int hamm16(u8 *p, int *err); +int hamm24(u8 *p, int *err); +int chk_parity(u8 *p, int n); +#endif diff --git a/util/alevt/help.c b/util/alevt/help.c new file mode 100644 index 0000000..b867855 --- /dev/null +++ b/util/alevt/help.c @@ -0,0 +1,83 @@ +#include "vt.h" +#include "misc.h" + +#define VFILL "     " +#define HELP_HEADER							\ +"........\6AleVT Online Help System       ",				\ +"  \22`p0`0    p `0pppp                    ",				\ +"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34",		\ +"\4\35\22\177,\177j5\177.! +t>! j5        \7"VFILL VERSION" \34",	\ +"  \22# #\42!\42#   \42   \42!                     ", +#define FLOF_DATA							\ +	1, { {0x100,ANY_SUB}, {0x200,ANY_SUB}, {0x300,ANY_SUB},		\ +	     {0x400,ANY_SUB}, {0x0ff,ANY_SUB}, {0x100,ANY_SUB} } + + +struct vt_page help_pages[] = +{ +    { 0x900, 0, -1, 0, 0, (1<<26)-1, { +#include "vt900.out" +    }, FLOF_DATA }, + +    { 0x901, 1, -1, 0, 0, (1<<26)-1, { +#include "vt901.out" +    }, FLOF_DATA }, + +    { 0x902, 1, -1, 0, 0, (1<<26)-1, { +#include "vt902.out" +    }, FLOF_DATA }, + +    { 0x903, 1, -1, 0, 0, (1<<26)-1, { +#include "vt903.out" +    }, FLOF_DATA }, + +    { 0x904, 1, -1, 0, 0, (1<<26)-1, { +#include "vt904.out" +    }, FLOF_DATA }, + +    { 0x905, 2, -1, 0, 0, (1<<26)-1, { +#include "vt905.out" +    }, FLOF_DATA }, + +    { 0x906, 1, -1, 0, 0, (1<<26)-1, { +#include "vt906.out" +    }, FLOF_DATA }, + +    { 0x907, 2, -1, 0, 0, (1<<26)-1, { +#include "vt907.out" +    }, FLOF_DATA }, + +    { 0x908, 1, -1, 0, 0, (1<<26)-1, { +#include "vt908.out" +    }, FLOF_DATA }, + +    { 0x909, 0, -1, 0, 0, (1<<26)-1, { +#include "vt909.out" +    }, FLOF_DATA }, + +    { 0x910, 2, -1, 0, 0, (1<<26)-1, { +#include "vt910.out" +    }, FLOF_DATA }, + +    { 0x911, 1, -1, 0, 0, (1<<26)-1, { +#include "vt911.out" +    }, FLOF_DATA }, + +    { 0x912, 2, -1, 0, 0, (1<<26)-1, { +#include "vt912.out" +    }, FLOF_DATA }, + +    { 0x913, 1, -1, 0, 0, (1<<26)-1, { +#include "vt913.out" +    }, FLOF_DATA }, + +    { 0x914, 0, -1, 0, 0, (1<<26)-1, { +#include "vt914.out" +    }, FLOF_DATA }, + +    { 0x915, 0, -1, 0, 0, (1<<26)-1, { +#include "vt915.out" +    }, FLOF_DATA }, +}; + +const int nr_help_pages = NELEM(help_pages); diff --git a/util/alevt/help.h b/util/alevt/help.h new file mode 100644 index 0000000..5df47fc --- /dev/null +++ b/util/alevt/help.h @@ -0,0 +1,8 @@ +#ifndef HELP_H +#define HELP_H + +#include "vt.h" + +extern struct vt_page help_pages[]; +extern const int nr_help_pages; +#endif diff --git a/util/alevt/icon.xbm b/util/alevt/icon.xbm new file mode 100644 index 0000000..27255a4 --- /dev/null +++ b/util/alevt/icon.xbm @@ -0,0 +1,17 @@ +#define icon_width 58 +#define icon_height 20 +static unsigned char icon_bits[] = { +  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, +  0xff, 0xff, 0xff, 0x03, 0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03, +  0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03, 0xc5, 0x23, 0xaa, 0xaa, +  0xa8, 0xf1, 0xf1, 0x03, 0xc6, 0x22, 0xfe, 0xd5, 0x58, 0xb1, 0xb1, 0x02, +  0x45, 0x23, 0x06, 0xaa, 0xa8, 0x51, 0x51, 0x01, 0xc6, 0x22, 0x06, 0xd6, +  0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac, 0xa8, 0x51, 0x51, 0x01, +  0xc6, 0x22, 0x62, 0xd4, 0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac, +  0xa8, 0x51, 0x51, 0x01, 0xc6, 0x23, 0x62, 0xd4, 0xf8, 0xb1, 0xb1, 0x02, +  0x05, 0x20, 0x02, 0xae, 0x61, 0x58, 0x51, 0x01, 0x06, 0x20, 0x02, 0x56, +  0x61, 0xa8, 0xb1, 0x02, 0xc5, 0x23, 0xe2, 0xab, 0x06, 0x56, 0x51, 0x01, +  0x46, 0x22, 0xe2, 0x57, 0x05, 0xaa, 0xb1, 0x02, 0xc7, 0x23, 0x06, 0xfe, +  0x9f, 0xff, 0xf1, 0x03, 0xc7, 0x23, 0x06, 0xfe, 0x9f, 0xff, 0xf1, 0x03, +  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, +  0xff, 0xff, 0xff, 0x03, }; diff --git a/util/alevt/lang.c b/util/alevt/lang.c new file mode 100644 index 0000000..3a49307 --- /dev/null +++ b/util/alevt/lang.c @@ -0,0 +1,393 @@ +#include <string.h> +#include <ctype.h> +#include "misc.h" +#include "vt.h" +#include "lang.h" + +int latin1 = -1; + + +static u8 lang_char[256]; +static u8 lang_chars[1+8+8][16] = +{ +    { 0, 0x23,0x24,0x40,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x7b,0x7c,0x7d,0x7e }, + +    // for latin-1 font +    // English (100%) +    { 0,  '£', '$', '@', '«', '½', '»', '¬', '#', '', '¼', '¦', '¾', '÷' }, +    // German (100%) +    { 0,  '#', '$', '§', 'Ä', 'Ö', 'Ü', '^', '_', '°', 'ä', 'ö', 'ü', 'ß' }, +    // Swedish/Finnish/Hungarian (100%) +    { 0,  '#', '¤', 'É', 'Ä', 'Ö', 'Å', 'Ü', '_', 'é', 'ä', 'ö', 'å', 'ü' }, +    // Italian (100%) +    { 0,  '£', '$', 'é', '°', 'ç', '»', '¬', '#', 'ù', 'à', 'ò', 'è', 'ì' }, +    // French (100%) +    { 0,  'é', 'ï', 'à', 'ë', 'ê', 'ù', 'î', '#', 'è', 'â', 'ô', 'û', 'ç' }, +    // Portuguese/Spanish (100%) +    { 0,  'ç', '$', '¡', 'á', 'é', 'í', 'ó', 'ú', '¿', 'ü', 'ñ', 'è', 'à' }, +    // Czech/Slovak (60%) +    { 0,  '#', 'u', 'c', 't', 'z', 'ý', 'í', 'r', 'é', 'á', 'e', 'ú', 's' }, +    // reserved (English mapping) +    { 0,  '£', '$', '@', '«', '½', '»', '¬', '#', '', '¼', '¦', '¾', '÷' }, + +    // for latin-2 font +    // Polish (100%) +    { 0,  '#', 'ñ', '±', '¯', '¦', '£', 'æ', 'ó', 'ê', '¿', '¶', '³', '¼' }, +    // German (100%) +    { 0,  '#', '$', '§', 'Ä', 'Ö', 'Ü', '^', '_', '°', 'ä', 'ö', 'ü', 'ß' }, +    // Estonian (100%) +    { 0,  '#', 'õ', '©', 'Ä', 'Ö', '®', 'Ü', 'Õ', '¹', 'ä', 'ö', '¾', 'ü' }, +    // Lettish/Lithuanian (90%) +    { 0,  '#', '$', '©', 'ë', 'ê', '®', 'è', 'ü', '¹', '±', 'u', '¾', 'i' }, +    // French (90%) +    { 0,  'é', 'i', 'a', 'ë', 'ì', 'u', 'î', '#', 'e', 'â', 'ô', 'u', 'ç' }, +    // Serbian/Croation/Slovenian (100%) +    { 0,  '#', 'Ë', 'È', 'Æ', '®', 'Ð', '©', 'ë', 'è', 'æ', '®', 'ð', '¹' }, +    // Czech/Slovak (100%) +    { 0,  '#', 'ù', 'è', '»', '¾', 'ý', 'í', 'ø', 'é', 'á', 'ì', 'ú', '¹' }, +    // Rumanian (95%) +    { 0,  '#', '¢', 'Þ', 'Â', 'ª', 'Ã', 'Î', 'i', 'þ', 'â', 'º', 'ã', 'î' }, +}; + +/* Yankable latin charset :-) +     !"#$%&'()*+,-./0123456789:;<=>? +    @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +    `abcdefghijklmnopqrstuvwxyz{|}~ +     ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ +    ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß +    àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ +*/ + + +static struct mark { u8 *g0, *latin1, *latin2; } marks[16] = +{ +    /* none */		{ "#", +    			  "¤", +			  "$"					}, +    /* grave - ` */	{ " aeiouAEIOU", +    			  "`àèìòùÀÈÌÒÙ", +			  "`aeiouAEIOU"				}, +    /* acute - ' */	{ " aceilnorsuyzACEILNORSUYZ", +			  "'ácéílnórsúýzÁCÉÍLNÓRSÚÝZ", +			  "'áæéíåñóà¶úý¼ÁÆÉÍÅÑÓÀ¦Úݬ"		}, +    /* cirumflex - ^ */	{ " aeiouAEIOU", +    			  "^âêîôûÂÊÎÔÛ", +			  "^âeîôuÂEÎÔU"				}, +    /* tilde - ~ */	{ " anoANO", +    			  "~ãñõÃÑÕ", +			  "~anoANO"				}, +    /* ??? - ¯ */	{ "", +    			  "", +			  ""					}, +    /* breve - u */	{ "aA", +    			  "aA", +			  "ãÃ"					}, +    /* abovedot - · */	{ "zZ", +    			  "zZ", +			  "¿¯"					}, +    /* diaeresis ¨ */	{ "aeiouAEIOU", +    			  "äëïöüÄËÏÖÜ", +			  "äëiöüÄËIÖÜ"				}, +    /* ??? - . */	{ "", +    			  "", +			  ""					}, +    /* ringabove - ° */	{ " auAU", +    			  "°åuÅU", +			  "°aùAÙ"				}, +    /* cedilla - ¸ */	{ "cstCST", +    			  "çstÇST", +			  "çºþǪÞ"				}, +    /* ??? - _ */	{ " ", +    			  "_", +			  "_"					}, +    /* dbl acute - " */	{ " ouOU", +    			  "\"ouOU", +			  "\"õûÕÛ"				}, +    /* ogonek - \, */	{ "aeAE", +    			  "aeAE", +			  "±ê¡Ê"				}, +    /* caron - v */	{ "cdelnrstzCDELNRSTZ", +			  "cdelnrstzCDELNRSTZ", +			  "èïìµòø¹»¾ÈÏÌ¥ÒØ©«®"			}, +}; + + +static u8 g2map_latin1[] = +   /*0123456789abcdef*/ +    " ¡¢£$¥#§¤'\"«    " +    "°±²³×µ¶·÷'\"»¼½¾¿" +    " `´^~   ¨.°¸_\"  " +    "_¹®©            " +    " ÆÐªH ILLØ ºÞTNn" +    "Kædðhiillø ßþtn\x7f"; + + +static u8 g2map_latin2[] = +   /*0123456789abcdef*/ +    " icL$Y#§¤'\"<    " +    "°   ×u  ÷'\">    " +    " `´^~ ¢ÿ¨.°¸_½²·" +    "- RC            " +    "  ÐaH iL£O opTNn" +    "K ðdhiil³o ßptn\x7f"; + + +void lang_init(void) +{ +    int i; + +    memset(lang_char, 0, sizeof(lang_char)); +    for (i = 1; i <= 13; i++) +	lang_char[lang_chars[0][i]] = i; +} + + +void conv2latin(u8 *p, int n, int lang) +{ +    int c, gfx = 0, lat=0; + +  if ((latin1 == KOI8) && lang==12) { /* russian */ +    while (n--) { +      c=*p; + +      if(c==0x1b) lat = !lat; /* ESC switches languages inside page */ + +       if ( is_koi(c)) { +         if (not gfx || (c & 0xa0) != 0x20) { +            if(!lat) conv2koi8(p); +         } +       } +	else if ((c & 0xe8) == 0) +	    gfx = c & 0x10; +	p++; +   } + } +else if ((latin1 == GREEK) && lang==15) { /* Hellas */ +    while (n--) { +      c=*p; + +      if(c==0x1b) lat = !lat; /* ESC switches languages inside page */ + +       if ( is_greek(c)) { +         if (not gfx || (c & 0xa0) != 0x20) { +            if(!lat) conv2greek(p); +         } +       } +	else if ((c & 0xe8) == 0) +	    gfx = c & 0x10; +	p++; +   } + } + + else { +    while (n--) +    { +	if (lang_char[c = *p]) +	{ +	    if (not gfx || (c & 0xa0) != 0x20)  +		*p = lang_chars[lang + 1][lang_char[c]]; +	} +	else if ((c & 0xe8) == 0) +	    gfx = c & 0x10; +	p++; +    } +  } +} + + +/* check for Greek chars - needs locale iso8859-7 set */ +int is_greek(int c) +{ +  if( isalpha(c | 0x80)) return 1; +  return 0; +} + + +/* check for russian chars - needs locale KOI8-R set */ +int is_koi(int c) +{ +  if( isalpha(c | 0x80)) return 1; +  if( c=='&' ) return 1; +  return 0; +} + + +/* teletext to koi8-r conversion */ +void conv2koi8(u8 *p) +{ +    u8 c; +    static u8 l2koi[]={ +	0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, +	0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, +	0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xFF, 0xFA, 0xFB, 0xFC, 0xFD, +	0xFE, 0xF9, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, +	0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, +	0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, +	0xDC, 0xDD, 0xDE, 0xDF +    }; + +      c= *p; +      if ( (c >= 0x40) && (c <= 0x7f)) *p=l2koi[(c & 0x7f) - 0x40]; +      if (c=='&') *p='Ù'; +} + + +/* teletext to iso8859-7 conversion */ +void conv2greek(u8 *p) +{ +    u8 c; +   static u8 l2greek[]={ +/* 1 @ 0x40->ú*/0xc0, +/* 2 A 0x41->Á*/0xc1, +/* 3 B 0x42->Â*/0xc2, +/* 4 C 0x43->Ã*/0xc3, +/* 5 D 0x44->Ä*/0xc4, +/* 6 E 0x45->Å*/0xc5, +/* 7 F 0x46->Æ*/0xc6, +/* 8 G 0x47->Ç*/0xc7, +/* 9 H 0x48->È*/0xc8, +/*10 I 0x49->É*/0xc9, +/*11 J 0x4a->Ê*/0xca, +/*12 K 0x4b->Ë*/0xcb, +/*13 L 0x4c->Ì*/0xcc, +/*14 M 0x4d->Í*/0xcd, +/*15 N 0x4e->Î*/0xce, +/*16 O 0x4f->Ï*/0xcf, +/*17 P 0x50->Ð*/0xd0, +/*18 Q 0x51->Ñ*/0xd1, +/*19 R 0x52->?*/0x52, +/*20 S 0x53->Ó*/0xd3, +/*21 T 0x54->Ô*/0xd4, +/*22 U 0x55->Õ*/0xd5, +/*23 V 0x56->Ö*/0xd6, +/*24 W 0x57->÷*/0xd7, +/*25 X 0x58->Ø*/0xd8, +/*26 Y 0x59->Ù*/0xd9, +/*27 Z 0x5a->?*/0x5a, +/*28 [ 0x5b->?*/0x5b, +/*!29 \ 0x5c->Ü*/0xdc, +/*!30 ] 0x5d->Ý*/0xdd, +/*!31 ^ 0x5e->Þ*/0xde, +/*!32 _ 0x5f->ß*/0xdf, +/*33 ` 0x60->?*/0x60, +/*!34 a 0x61->á*/0xe1, +/*!35 b 0x62->â*/0xe2, +/*!36 c 0x63->ã*/0xe3, +/*!37 d 0x64->ä*/0xe4, +/*!38 e 0x65->å*/0xe5, +/*!39 f 0x66->æ*/0xe6, +/*!40 g 0x67->ç*/0xe7, +/*!41 h 0x68->è*/0xe8, +/*!42 i 0x69->é*/0xe9, +/*!43 j 0x6a->ê*/0xea, +/*!44 k 0x6b->ë*/0xeb, +/*!45 l 0x6c->ì*/0xec, +/*!46 m 0x6d->í*/0xed, +/*!47 n 0x6e->î*/0xee, +/*!48 o 0x6f->ï*/0xef, +/*!49 p 0x70->ð*/0xf0, +/*!50 q 0x71->ñ*/0xf1, +/*!51 r 0x72->ò*/0xf2, +/*!52 s 0x73->ó*/0xf3, +/*!53 t 0x74->ô*/0xf4, +/*!54 u 0x75->õ*/0xf5, +/*!55 v 0x76->ö*/0xf6, +/*!56 w 0x77->÷*/0xf7, +/*!57 x 0x78->ø*/0xf8, +/*!58 y 0x79->ù*/0xf9, +/*59 z 0x7a->ú(ìå ôüíï)*/0xc0, +/*60 { 0x7b->?*/0x7b, +/*!61 | 0x7c->ü*/0xfc, +/*!62 } 0x7d->ý*/0xfd, +/*!63 ~ 0x7e->þ*/0xfe, +/*64   0x7f->?*/0x7f +  }; +      c= *p; +      if ( (c >= 0x40) && (c <= 0x7f)) *p=l2greek[(c & 0x7f) - 0x40]; +} + + +void init_enhance(struct enhance *eh) +{ +    eh->next_des = 0; +} + + +void add_enhance(struct enhance *eh, int dcode, u32 *t) +{ + +    if (dcode == eh->next_des) +    { +	memcpy(eh->trip + dcode * 13, t, 13 * sizeof(*t)); +	eh->next_des++; +    } +    else +	eh->next_des = -1; +} + + +void enhance(struct enhance *eh, struct vt_page *vtp) +{ +    int row = 0; +    u32 *p, *e; + +    if (eh->next_des < 1) +	return; + +    for (p = eh->trip, e = p + eh->next_des * 13; p < e; p++) +	if (*p % 2048 != 2047) +	{ +	    int adr = *p % 64; +	    int mode = *p / 64 % 32; +	    int data = *p / 2048 % 128; + +	    if (adr < 40) +	    { +		// col functions +		switch (mode) +		{ +		    case 15: // char from G2 set +			if (adr < W && row < H) +			    if (latin1==LATIN1) +				vtp->data[row][adr] = g2map_latin1[data-32]; +			    else if (latin1==LATIN2) +				vtp->data[row][adr] = g2map_latin2[data-32]; +			break; +		    case 16 ... 31: // char from G0 set with diacritical mark +			if (adr < W && row < H) +			{ +			    struct mark *mark = marks + (mode - 16); +			    u8 *x; + +			    if (x = strchr(mark->g0, data)) +				if (latin1==LATIN1) +				    data = mark->latin1[x - mark->g0]; +				else if (latin1==LATIN2) +				    data = mark->latin2[x - mark->g0]; +			    vtp->data[row][adr] = data; +			} +			break; +		} +	    } +	    else +	    { +		// row functions +		if ((adr -= 40) == 0) +		    adr = 24; +		 +		switch (mode) +		{ +		    case 1: // full row color +			row = adr; +			break; +		    case 4: // set active position +			row = adr; +			break; +		    case 7: // address row 0 (+ full row color) +			if (adr == 23) +			    row = 0; +			break; +		} +	    } +	} +} diff --git a/util/alevt/lang.h b/util/alevt/lang.h new file mode 100644 index 0000000..531f3b0 --- /dev/null +++ b/util/alevt/lang.h @@ -0,0 +1,28 @@ +#ifndef LANG_H +#define LANG_H + +#include "misc.h" +#include "vt.h" + +extern int latin1; + +#define LATIN1 1 +#define LATIN2 2 +#define KOI8 3 +#define GREEK 4 + + +struct enhance +{ +    int next_des; // next expected designation code +    u32 trip[13*16]; // tripplets +}; + +void lang_init(void); +void conv2latin(u8 *p, int n, int lang); +void conv2koi8(u8 *p); +void conv2greek(u8 *p); +void init_enhance(struct enhance *eh); +void add_enhance(struct enhance *eh, int dcode, u32 *data); +void enhance(struct enhance *eh, struct vt_page *vtp); +#endif diff --git a/util/alevt/main.c b/util/alevt/main.c new file mode 100644 index 0000000..31fe9c3 --- /dev/null +++ b/util/alevt/main.c @@ -0,0 +1,221 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <locale.h> +#include "vt.h" +#include "misc.h" +#include "fdset.h" +#include "xio.h" +#include "vbi.h" +#include "lang.h" +#include "cache.h" +#include "ui.h" + +static char *geometry; +static char *dpy_name; +static char *vbi_name = NULL; +static struct xio *xio; +static struct vbi *vbi; +static int erc = 1; +char *outfile = ""; +static char *channel; +static int ttpid = -1; +u_int16_t sid = 0; + + +static void usage(FILE *fp, int exitval) +{ +    fprintf(fp, "\nUsage: %s [options]\n", prgname); +    fprintf(fp, +	    "\n" +	    "  Valid options:\t\tDefault:\n" +	    "    -c <channel name>\t\t(none;dvb only)\n" +	    "    -ch -child <ppp.ss>\t\t(none)\n" +	    "    -cs -charset\t\tlatin-1\n" +	    "    <latin-1/2/koi8-r/iso8859-7>\n" +	    "    -h -help\n" +	    "    -o <outfile>\t\t(none;dvb only)\n" +	    "    -p -parent <ppp.ss>\t\t900\n" +	    "    -s -sid <sid>\t\t(none;dvb only)\n" +	    "    -t -ttpid <ttpid>\t\t(none;dvb only)\n" +	    "    -v -vbi <vbidev>\t\t/dev/vbi\n" +		"                 \t\t/dev/vbi0\n" +		"                 \t\t/dev/video0\n" +		"                 \t\t/dev/dvb/adapter0/demux0\n" +	    "\n" +	    "  ppp.ss stands for a page number and an\n" +	    "  optional subpage number (Example: 123.4).\n" +	    "\n" +	    "  The -child option requires a parent\n" +	    "  window. So it must be preceded by\n" +	    "  a parent or another child window.\n" +	); +    exit(exitval); +} + + +static int arg_pgno(char *p, int *subno) +{ +    char *end; +    int pgno; + +    *subno = ANY_SUB; +    if (*p) +    { +	pgno = strtol(p, &end, 16); +	if ((*end == ':' || *end == '/' || *end == '.') && end[1]) +	    *subno = strtol(end + 1, &end, 16); +	if (*end == 0) +	    if (pgno >= 0x100 && pgno <= 0x999) +		if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f)) +		    return pgno; +    } +    fatal("%s: invalid page number", p); +} + + +static struct vtwin * start(int argc, char **argv, struct vtwin *parent, +	int pgno, int subno) +{ +    static int valid_vbi_name = 1; + +    if (!valid_vbi_name) +	return parent; + +    if (vbi == 0) +	vbi = vbi_open(vbi_name, cache_open(), channel, outfile, sid, ttpid); +    if (vbi == 0) +    { +	if (vbi_name) +	    error("cannot open device: %s", vbi_name); +    	valid_vbi_name = 0; +    	vbi = open_null_vbi(cache_open()); +    } +    if (vbi->cache) +	vbi->cache->op->mode(vbi->cache, CACHE_MODE_ERC, erc); + +    if (xio == 0) +	xio = xio_open_dpy(dpy_name, argc, argv); +    if (xio == 0) +	fatal("cannot open display"); + +    parent = vtwin_new(xio, vbi, geometry, parent, pgno, subno); +    if (parent == 0) +	fatal("cannot create window"); + +    if (!valid_vbi_name) +    { +	if (vbi_name) +	    send_errmsg(vbi, "cannot open device: %s", vbi_name); +	else +	    send_errmsg(vbi, "cannot open any device", vbi_name); +    } + +    return parent; +} + + +static int option(int argc, char **argv, int *ind, char **arg) +{ +    static struct { char *nam, *altnam; int arg; } opts[] = { +	{ "-channel", "-c", 1 }, +	{ "-child", "-ch", 1 }, +	{ "-charset", "-cs", 1 }, +	{ "-help", "-h", 0 }, +	{ "-outfile", "-o", 1 }, +	{ "-parent", "-p", 1 }, +	{ "-sid", "-s", 1 }, +	{ "-ttpid", "-t", 1 }, +	{ "-vbi", "-v", 1 }, +    }; +    int i; +    if (*ind >= argc) +	return 0; +    *arg = argv[(*ind)++]; +    for (i = 0; i < NELEM(opts); ++i) +	if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam)) +	{ +	    if (opts[i].arg) +		if (*ind < argc) +		    *arg = argv[(*ind)++]; +		else +		    fatal("option %s requires an argument", *arg); +	    return i+1; +	} +    if (**arg == '-') +    { +	fatal("%s: invalid option", *arg); +	usage(stderr, 1); +    } +    return -1; +} + + +int main(int argc, char **argv) +{ +    struct vtwin *parent = 0; +    int pgno, subno; +    int opt, ind; +    char *arg; +    sid = 0; + +    setprgname(argv[0]); +    fdset_init(fds); + +    ind = 1; +    while (opt = option(argc, argv, &ind, &arg)) +	switch (opt) +	{ + +	    case 1: // channel +		channel = arg; +		break; +	    case 2: // child +		if (parent == 0) +		    fatal("-child requires a parent window"); +		pgno = arg_pgno(arg, &subno); +		parent = start(argc, argv, parent, pgno, subno); +		geometry = 0; +		break; +	    case 3: // charset +		if (streq(arg, "latin-1") || streq(arg, "1")) +		    latin1 = LATIN1; +		else if (streq(arg, "latin-2") || streq(arg, "2")) +		    latin1 = LATIN2; +		else if (streq(arg, "koi8-r") || streq(arg, "koi")) +		    latin1 = KOI8; +		else if (streq(arg, "iso8859-7") || streq(arg, "el")) +		    latin1 = GREEK; +		else +		    fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)"); +		break; +	    case 4: // help +		usage(stdout, 0); +		break; +	    case 5: // outfile +		outfile = arg; +		break; +	    case 6: // parent +	    case -1: // non-option arg +		pgno = arg_pgno(arg, &subno); +		parent = start(argc, argv, 0, pgno, subno); +		geometry = 0; +		break; +	    case 7: // sid +		sid = strtoul(arg, NULL, 0); +		break; +	    case 8: // ttpid +		ttpid = strtoul(arg, NULL, 0); +		break; +	    case 9: // vbi +		vbi_name = arg; +		vbi = 0; +		parent = 0; +		break; +	} + +    if (parent == 0) +    start(argc, argv, 0, 0x900, ANY_SUB); +    xio_event_loop(); +    exit(0); +} diff --git a/util/alevt/misc.c b/util/alevt/misc.c new file mode 100644 index 0000000..32d0595 --- /dev/null +++ b/util/alevt/misc.c @@ -0,0 +1,66 @@ +#include <stdio.h> +#include <stdarg.h> +#include "misc.h" + +char *prgname = 0; + +extern char *strrchr(const char *, int); +NORETURN(exit(int)); + + +void setprgname(char *str) +{ +    char *x = strrchr(str, '/'); +    prgname = x ? x+1 : str; +} + + +static void print_prgname(void) +{ +    if (prgname && *prgname) +	fprintf(stderr, "%s: ", prgname); +} + + +void error(const char *str, ...) +{ +    va_list args; +    va_start(args, str); +    print_prgname(); +    vfprintf(stderr, str, args); +    fputc('\n', stderr); +} + + +void ioerror(const char *str) +{ +    print_prgname(); +    perror(str); +} + + +void fatal(const char *str, ...) +{ +    va_list args; +    va_start(args, str); +    print_prgname(); +    vfprintf(stderr, str, args); +    fputc('\n', stderr); +    exit(2); +} + + +void fatal_ioerror(const char *str) +{ +    print_prgname(); +    perror(str); +    exit(2); +} + + +void out_of_mem(int size) +{ +    if (size > 0) +	fatal("out of memory allocating %d bytes.", size); +    fatal("out of memory."); +} diff --git a/util/alevt/misc.h b/util/alevt/misc.h new file mode 100644 index 0000000..00a71f8 --- /dev/null +++ b/util/alevt/misc.h @@ -0,0 +1,32 @@ +#ifndef MISC_H +#define MISC_H +#define PTR (void *) +#define NELEM(x) ((int)(sizeof(x)/sizeof(*(x)))) +#define NORETURN(x) void x __attribute__((__noreturn__)) +#define DEFINE(x) typeof(x) x +#define OFFSET_OF(type, elem) ((u8 *)&((type *)0)->elem - (u8 *)0) +#define BASE_OF(type, elem, p) ((type *)((u8 *)(p) - OFFSET_OF(type, elem))) + +#define not ! +#define streq(a, b) (strcmp((a), (b)) == 0) +#define min(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a < _b ? _a : _b; }) +#define max(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a > _b ? _a : _b; }) +#define bound(a,b,c) ({ typeof(a) _a = a; typeof(b) _b = b; typeof(c) _c = c; \ +	_b < _a ? _a : _b > _c ? _c : _b; }) + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef signed char s8; +typedef signed short s16; +typedef signed int s32; + +extern char *prgname; +void setprgname(char *argv_0); + +NORETURN(fatal(const char *str, ...)); +NORETURN(fatal_ioerror(const char *str)); +NORETURN(out_of_mem(int size)); +void error(const char *str, ...); +void ioerror(const char *str); +#endif diff --git a/util/alevt/os.h b/util/alevt/os.h new file mode 100644 index 0000000..50b7662 --- /dev/null +++ b/util/alevt/os.h @@ -0,0 +1,7 @@ +#ifndef OS_H +#define OS_H +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBsd__) \ +	|| defined(__bsdi__) +#define BSD +#endif +#endif diff --git a/util/alevt/search.c b/util/alevt/search.c new file mode 100644 index 0000000..082cefb --- /dev/null +++ b/util/alevt/search.c @@ -0,0 +1,127 @@ +#include <sys/types.h> // for freebsd +#include <stdlib.h> +#include "vt.h" +#include "misc.h" +#include "cache.h" +#include "search.h" + + +static void convert(u8 *p, u8 *buf, int *line) +{ +    int x, y, c, ch, gfx, hid = 0; + +    for (y = 1, p += 40; y < 25; ++y) +    { +	if (not hid) +	{ +	    gfx = 0; +	    for (x = 0; x < 40; ++x) +	    { +		c = ' '; +		switch (ch = *p++) +		{ +		    case 0x00 ... 0x07: +			gfx = 0; +			break; +		    case 0x10 ... 0x17: +			gfx = 1; +			break; +		    case 0x0c: +			hid = 1; +			break; +		    case 0x7f: +			c = '*'; +			break; +		    case 0x20 ... 0x7e: +			if (gfx && ch != ' ' && (ch & 0xa0) == 0x20) +			    ch = '#'; +		    case 0xa0 ... 0xff: +			c= ch; +		} +		*buf++ = c; +	    } +	    *buf++ = '\n'; +	    *line++ = y; +	} +	else +	{ +	    p += 40; +	    hid = 0; +	} +    } +    *line = y; +    *buf = 0; +} + + +static int search_pg(struct search *s, struct vt_page *vtp) +{ +    regmatch_t m[1]; +    u8 buf[H *(W+1) + 1]; +    int line[H]; + +    convert(PTR vtp->data, buf, line); +    if (regexec(s->pattern, buf, 1, m, 0) == 0) +    { +	s->len = 0; +	if (m->rm_so >= 0) +	{ +	    s->y = line[m->rm_so / (W+1)]; +	    s->x = m->rm_so % (W+1); +	    s->len = m->rm_eo - m->rm_so; +	    if (s->x + s->len > 40) +		s->len = 40 - s->x; +	} +	return 1; +    } +    return 0; +} + + +struct search * search_start(struct cache *ca, u8 *pattern) +{ +    struct search *s; +    int f = 0; + +    if (not(s = malloc(sizeof(*s)))) +	goto fail1; + +    if (pattern[0] == '!') +	pattern++; +    else +	f = REG_ICASE; + +    if (regcomp(s->pattern, pattern, f | REG_NEWLINE) != 0) +	goto fail2; + +    s->cache = ca; +    return s; + +fail2: +    free(s); +fail1: +    return 0; +} + + +void search_end(struct search *s) +{ +    regfree(s->pattern); +    free(s); +} + + +int search_next(struct search *s, int *pgno, int *subno, int dir) +{ +    struct vt_page *vtp = 0; + +    if (s->cache) +	vtp = s->cache->op->foreach_pg(s->cache, *pgno, *subno, dir, +	search_pg, s); +    if (vtp == 0) +	return -1; + +    *pgno = vtp->pgno; +    *subno = vtp->subno ?: ANY_SUB; +    return 0; +} diff --git a/util/alevt/search.h b/util/alevt/search.h new file mode 100644 index 0000000..c7e813a --- /dev/null +++ b/util/alevt/search.h @@ -0,0 +1,16 @@ +#ifndef SEARCH_H +#define SEARCH_H + +#include <regex.h> + +struct search +{ +    struct cache *cache; +    regex_t pattern[1]; +    int x, y, len; // the position of the match +}; + +struct search *search_start(struct cache *ca, u8 *pattern); +void search_end(struct search *s); +int search_next(struct search *s, int *pgno, int *subno, int dir); +#endif diff --git a/util/alevt/ui.c b/util/alevt/ui.c new file mode 100644 index 0000000..70391c7 --- /dev/null +++ b/util/alevt/ui.c @@ -0,0 +1,721 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <ctype.h> +#include <stdarg.h> +#include "vt.h" +#include "misc.h" +#include "xio.h" +#include "vbi.h" +#include "fdset.h" +#include "search.h" +#include "export.h" +#include "ui.h" + +static void vtwin_event(struct vtwin *w, struct vt_event *ev); +static void msg(struct vtwin *w, u8 *str, ...); +static void err(struct vtwin *w, u8 *str, ...); + +#define hist(w,o) ((w)->hist + (((w)->hist_top + (o)) & (N_HISTORY-1))) + + +static int inc_hex(int i, int bcd_mode) +{ +    i++; +    if (bcd_mode) +    { +	if ((i & 0x000f) > 0x0009) +	    i = (i + 0x0010) & 0x0ff0; +	if ((i & 0x00f0) > 0x090) +	    i = (i + 0x0100) & 0x0f00; +	if ((i & 0x0f00) > 0x0900) +	    i = (i + 0x1000) & 0xf000; +    } +    return i; +} + + +static int dec_hex(int i, int bcd_mode) +{ +    i--; +    if (bcd_mode) +    { +	if ((i & 0x000f) > 0x0009) +	    i = (i & 0xfff0) + 0x0009; +	if ((i & 0x00f0) > 0x0090) +	    i = (i & 0xff00) + 0x0099; +	if ((i & 0x0f00) > 0x0900) +	    i = (i & 0xf000) + 0x0999; +    } +    return i; +} + + +static void set_title(struct vtwin *w) +{ +    char buf[32], buf2[32]; + +    if (w->subno == ANY_SUB) +	sprintf(buf, "%x", w->pgno); +    else +	sprintf(buf, "%x/%x", w->pgno, w->subno); +    if (w->searching) +	sprintf(buf2, "(%s)", buf); +    else +	sprintf(buf2, "%s", buf); +    xio_title(w->xw, buf2); +} + + +static void query_page(struct vtwin *w, int pgno, int subno) +{ +    w->pgno = pgno; +    w->subno = subno; +    w->searching = 1; +    w->hold = 0; //subno != ANY_SUB; +    xio_set_concealed(w->xw, w->revealed = 0); + +    if (hist(w, 0)->pgno != pgno || +	(hist(w,0)->subno == ANY_SUB && subno != ANY_SUB)) +	w->hist_top++; +    hist(w, 0)->pgno = pgno; +    hist(w, 0)->subno = subno; +    hist(w, 1)->pgno = 0;	// end marker + +    xio_cancel_selection(w->xw); +    if (vbi_query_page(w->vbi, pgno, subno) == 0) +    { +	w->vtp = 0; +    } +    set_title(w); +} + + +static void new_or_query(struct vtwin *w, int pgno, int subno, int new_win) +{ +    if (new_win) +    { +	if (w->child) +	    query_page(w->child, pgno, subno); +	else +	    vtwin_new(w->xw->xio, w->vbi, 0, w, pgno, subno); +    } +    else +	query_page(w, pgno, subno); +} + +static int _next_pgno(int *arg, struct vt_page *vtp) +{ +    int pgno = vtp->pgno; + +    if (arg[0] == pgno) // want different page +	return 0; +    if (arg[1])		// and not a hex page +	for (; pgno; pgno >>=4) +	    if ((pgno & 15) > 9) +		return 0; +    return 1; +} + + +static int _next_subno(int *arg, struct vt_page *vtp) +{ +    return vtp->pgno == arg[0];	// only subpages of this page +} + + +static void do_next_pgno(struct vtwin *w, int dir, int bcd_mode, int subs, +    int new_win) +{ +    struct vt_page *vtp; +    struct vtwin *cw = (new_win && w->child) ? w->child : w; +    int pgno = cw->pgno; +    int subno = cw->subno; + +    if (w->vbi->cache) +    { +	int arg[2]; +	arg[0] = pgno; +	arg[1] = bcd_mode; +        if (vtp = w->vbi->cache->op->foreach_pg(w->vbi->cache, +		    pgno, subno, dir, subs ? _next_subno:_next_pgno, &arg)) +	{ +	    new_or_query(w, vtp->pgno, subs ? vtp->subno : ANY_SUB, new_win); +	    return; +	} +    } +    err(w, "No page."); +} + +#define notdigit(x) (not isdigit((x))) + + +static int chk_screen_fromto(u8 *p, int x, int *n1, int *n2) +{ +    p += x; + +    if (x >= 0 && x+5 < 42) +	if (notdigit(p[1]) || notdigit(p[0])) +	    if (isdigit(p[2])) +		if (p[3] == '/' || p[3] == ':') +		    if (isdigit(p[4])) +			if (notdigit(p[5]) || notdigit(p[6]))	/* p[6] is save here */ +			{ +			    *n1 = p[2] % 16; +			    if (isdigit(p[1])) +				*n1 += p[1] % 16 * 16; +			    *n2 = p[4] % 16; +			    if (isdigit(p[5])) +				*n2 = *n2 * 16 + p[5] % 16; +			    return 1; +			} +    return 0; +} + + +static int chk_screen_pgno(u8 *p, int x, int *pgno, int *subno) +{ +    p += x; + +    if (x >= 0 && x+4 < 42) +	if (notdigit(p[0]) && notdigit(p[4])) +	    if (isdigit(p[1]) && isdigit(p[2]) && isdigit(p[3])) +	    { +		*pgno = p[1] % 16 * 256 + p[2] % 16 * 16 + p[3] % 16; +		if (*pgno >= 0x100 && *pgno <= 0x999) +		{ +		    *subno = ANY_SUB; +		    if (x+6 < 42) +			if (p[4] == '.' || p[4] == '/') +			    if (isdigit(p[5])) +				if (notdigit(p[6]) || notdigit(p[7]))	/* p[7] is save here */ +				{ +				    *subno = p[5] % 16; +				    if (isdigit(p[6])) +					*subno = *subno * 16 + p[6] % 16; +				} +		    // hackhackhack: +		    // pgno followed by start box gets subno 1 +		    if (x+4 < 42 && p[4] == 11) +			*subno = 1; +		    return 1; +		} +	    } +    return 0; +} + + +static void do_screen_pgno(struct vtwin *w, int x, int y, int new_win) +{ +    u8 buf[42]; +    int n1, n2, i; + +    if (x >= 0 && x < 40) +    { +	if (xio_get_line(w->xw, y, buf+1) == 0) +	{ +	    buf[0] = buf[41] = ' '; +	    x++; + +	    for (i = -6; i < 35; i++) +	    { +		if (w->vtp == 0 || w->vtp->subno != 0) +		    if (chk_screen_fromto(buf, x+i, &n1, &n2)) +		    { +			// subno cycling works wrong with children. +			// so middle button cycles backwards... +			if (w->subno != ANY_SUB) +			    n1 = w->subno; +			n1 = new_win ? dec_hex(n1, 1) : inc_hex(n1, 1); +			if (n1 < 1) +			    n1 = n2; +			if (n1 > n2) +			    n1 = 1; +			new_or_query(w, w->pgno, n1, 0); +			return; +		    } +		if (i >= -4) +		    if (chk_screen_pgno(buf, x+i, &n1, &n2)) +		    { +			new_or_query(w, n1, n2, new_win); +			return; +		    } +	    } +	} +    } +    err(w, "No page."); +} + + +static void do_flof_pgno(struct vtwin *w, int button, int x, int new_win) +{ +    struct vt_page *vtp = w->vtp; +    int lk = 99, i, c; + +    if (vtp && vtp->flof) +    { +	switch (button) +	{ +	    case 1 ... 3: +		for (i = 0; i <= x && i < 40; ++i) +		    if ((c = vtp->data[24][i]) < 8)	// fg-color code +			lk = c; +		lk = "x\0\1\2\3x\3x"[lk];		// color -> link# +		break; +	    case KEY_F(1): lk = 0; break; +	    case KEY_F(2): lk = 1; break; +	    case KEY_F(3): lk = 2; break; +	    case KEY_F(4): lk = 3; break; +	    case KEY_F(5): lk = 5; break; +	} +	if (lk < 6 && (vtp->link[lk].pgno & 0xff) != 0xff) +	{ +	    new_or_query(w, vtp->link[lk].pgno, vtp->link[lk].subno, new_win); +	    return; +	} +    } +    else +    { +	switch (button) +	{ +	    case 1 ... 3: lk = x / 8;	break; +	    case KEY_F(1): lk = 0;	break; +	    case KEY_F(2): lk = 1;	break; +	    case KEY_F(3): lk = 2;	break; +	    case KEY_F(4): lk = 3;	break; +	    case KEY_F(5): lk = 4;	break; +	} +	switch (lk) +	{ +	    case 0: new_or_query(w, 0x100, ANY_SUB, new_win);	return; +	    case 1: do_next_pgno(w, -1, 1, 0, new_win);		return; +	    case 2: new_or_query(w, 0x900, ANY_SUB, new_win);	return; +	    case 3: do_next_pgno(w, 1, 1, 0, new_win);		return; +	    case 4: new_or_query(w, 0x999, ANY_SUB, new_win);	return; +	} +    } +    err(w, "No page."); +} + + +static void do_hist_pgno(struct vtwin *w) +{ +    if (hist(w, -1)->pgno) +    { +	w->hist_top--; +	query_page(w, hist(w, 0)->pgno, hist(w, 0)->subno); +    } +    else +	err(w, "Empty history."); +} + + +static void put_head_line(struct vtwin *w, u8 *p) +{ +    char buf[40]; + +    if (p == 0) +	xio_get_line(w->xw, 0, buf); +    else +	memcpy(buf + 8, p + 8, 32); + +    if (w->subno == ANY_SUB) +	sprintf(buf, "\2%3x \5\xb7", w->pgno); +    else +	sprintf(buf, "\2S%02x \5\xb7", w->subno & 0xff); + +    if (w->searching) +	buf[0] = 1; +    if (w->hold) +	buf[4] = 'H'; +    if (w->xw->concealed) +	buf[6] = '*'; +    buf[7] = 7; + +    xio_put_line(w->xw, 0, buf); +} + + +static void put_menu_line(struct vtwin *w) +{ +    if (w->status > 0) +	xio_put_line(w->xw, 24, w->statusline); +    else if (w->vtp && w->vtp->flof) +	xio_put_line(w->xw, 24, w->vtp->data[24]); +    else +	xio_put_line(w->xw, 24, "\0   100     \4<<  \6Help  \4>>\0     999    "); +} + + +static void _msg(struct vtwin *w, u8 *str, va_list args) +{ +    u8 buf[128]; +    int i; + +    i = vsprintf(buf, str, args); +    if (i > W) +    i = W; +    memset(w->statusline, ' ', W); +    memcpy(w->statusline + (W-i+1)/2, buf, i); +    w->status = 6; +    put_menu_line(w); +} + + +static void msg(struct vtwin *w, u8 *str, ...) +{ +    va_list args; + +    va_start(args, str); +    _msg(w, str, args); +    va_end(args); +} + + +static void err(struct vtwin *w, u8 *str, ...) +{ +    va_list args; + +    va_start(args, str); +    _msg(w, str, args); +    va_end(args); +} + + +static void next_search(struct vtwin *w, int rev) +{ +    if (w->search) +    { +	int pgno = w->pgno; +	int subno = w->subno; +	int dir = rev ? -w->searchdir : w->searchdir; + +	if (search_next(w->search, &pgno, &subno, dir) == 0) +	{ +	    query_page(w, pgno, subno); +	    if (not w->searching && w->search->len) +		xio_set_selection(w->xw, w->search->x, w->search->y, +			    w->search->x + w->search->len - 1, w->search->y); +	    return; +	} +	else +	    err(w, "Pattern not found."); +    } +    else +	err(w, "No search pattern."); +} + + +static void start_search(struct vtwin *w, u8 *string) +{ +    if (not string) +	return; + +    if (*string) +    { +	if (w->search) +	    search_end(w->search); +	w->search = search_start(w->vbi->cache, string); +	if (w->search == 0) +	{ +	    err(w, "Bad search pattern."); +	    return; +	} +    } +    next_search(w, 0); +} + + +static void start_save2(struct vtwin *w, u8 *name) +{ +    if (name && *name) +	if (export(w->export, w->vtp, name)) +	    err(w, export_errstr()); + +    export_close(w->export); +    w->export = 0; +    put_menu_line(w); +} + + +struct vtwin * vtwin_new(struct xio *xio, struct vbi *vbi, char *geom, +    struct vtwin *parent, int pgno, int subno) +{ +    struct vtwin *w; + +    if (not(w = malloc(sizeof(*w)))) +	goto fail1; + +    if (not (w->xw = xio_open_win(xio, geom))) +	goto fail2; +    w->vbi = vbi; +    w->vtp = 0; +    w->search = 0; +    w->export = 0; +    w->parent = parent; +    w->child = 0; +    if (parent && parent->child) +	fatal("internal error: parent already has a child != 0"); +    if (parent) +	parent->child = w; + +    w->hist_top = 1; +    hist(w,0)->pgno = 0; +    hist(w,1)->pgno = 0; +    w->status = 0; +    xio_set_handler(w->xw, vtwin_event, w); +    vbi_add_handler(w->vbi, vtwin_event, w); +    query_page(w, pgno, subno); +    return w; + +fail2: +    free(w); +fail1: +    return 0; +} + + +static void vtwin_close(struct vtwin *w) +{ +    if (w->parent) +	w->parent->child = w->child; +    if (w->child) +	w->child->parent = w->parent; + +    if (w->search) +	search_end(w->search); +    if (w->export) +	export_close(w->export); + +    vbi_del_handler(w->vbi, vtwin_event, w); +    xio_close_win(w->xw, 1); +    free(w); +} + + +static void vtwin_event(struct vtwin *w, struct vt_event *ev) +{ +    struct xio_win *xw = w->xw; +    int i; + +    switch (ev->type) +    { +	case EV_CLOSE: +	    vtwin_close(w); +	    break; + +	case EV_TIMER: +	    if (w->status > 0 && --w->status == 0) +		put_menu_line(w); +	    break; + +	case EV_KEY: +	{ +	    switch (ev->i1) +	    { +		case '0' ... '9': +		    i = ev->i1 - '0'; +		    if (w->pgno >= 0x100) +		    { +			if (i == 0) +			    break; +			w->pgno = i; +		    } +		    else +		    { +			w->pgno = w->pgno * 16 + i; +			if (w->pgno >= 0x100) +			    query_page(w, w->pgno, ANY_SUB); +		    } +		    break; +		case 'q': +		case '\e': +		    vtwin_close(w); +		    break; +		case 'h': +		    query_page(w, 0x900, ANY_SUB); +		    break; +		case 'e': +		    if (w->vbi->cache) +		    { +			i = w->vbi->cache->op->mode(w->vbi->cache, +							    CACHE_MODE_ERC, 0); +			w->vbi->cache->op->mode(w->vbi->cache, +							    CACHE_MODE_ERC, !i); +			msg(w, "Error reduction %sabled.", i ? "dis" : "en"); +		    } +		    break; +		case 'o': +		    if (vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno) == 0) +			err(w, "Unable to open new window."); +		    break; +		case KEY_RIGHT: +		    do_next_pgno(w, 1, not ev->i2, 0, 0); +		    break; +		case KEY_LEFT: +		    do_next_pgno(w, -1, not ev->i2, 0, 0); +		    break; +		case KEY_UP: +		    do_next_pgno(w, -1, not ev->i2, 1, 0); +		    break; +		case KEY_DOWN: +		    do_next_pgno(w, 1, not ev->i2, 1, 0); +		    break; +		case '\b': +		    do_hist_pgno(w); +		    break; +		case ' ': +		    w->hold = !w->hold; +		    break; +		case 'c': +		    vbi_reset(w->vbi); +		    break; +		case 'i': +		    if (w->vtp && w->vtp->flof && +					 (w->vtp->link[5].pgno & 0xff) != 0xff) +			query_page(w, w->vtp->link[5].pgno, +						 w->vtp->link[5].subno); +		    else +			query_page(w, 0x100, ANY_SUB); +		    break; +		case 'r': +		    xio_set_concealed(xw, w->revealed = !w->revealed); +		    break; +		case KEY_F(1) ... KEY_F(5): +		    do_flof_pgno(w, ev->i1, 0, ev->i2); +		    break; +		case 'n': +		    next_search(w, 0); +		    break; +		case 'N': +		    next_search(w, 1); +		    break; +		default: +		    err(w, "Unused key."); +		    break; +	    } +	    break; +	} +	case EV_RESET: +	{ +	    if (w->search) +		search_end(w->search); +	    w->search = 0; + +	    query_page(w, w->pgno, w->subno); +	    msg(w, "Cache cleared!"); +	    break; +	} +	case EV_MOUSE: +	{ +	    if (ev->i1 == 3) +		do_hist_pgno(w); +	    else if (ev->i1 == 5) // wheel mouse +		do_next_pgno(w, 1, not ev->i2, 0, 0); +	    else if (ev->i1 == 4) // wheel mouse +		do_next_pgno(w, -1, not ev->i2, 0, 0); +	    else if (ev->i1 == 7) // dual wheel mouse +		do_next_pgno(w, 1, not ev->i2, 1, 0); +	    else if (ev->i1 == 6) // dual wheel mouse +		do_next_pgno(w, -1, not ev->i2, 1, 0); +	    else if (ev->i4 == 24) +		do_flof_pgno(w, ev->i1, ev->i3, ev->i1 == 2); +	    else if (ev->i4 == 0 && ev->i3 < 5) +	    { +		if (ev->i1 == 1) +		    w->hold = !w->hold; +		else +		    vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno); +	    } +	    else if (ev->i4 == 0 && ev->i3 < 8) +	    { +		if (ev->i1 == 2 && w->child) +		    w = w->child; +		xio_set_concealed(w->xw, w->revealed = !w->revealed); +	    } +	    else +		do_screen_pgno(w, ev->i3, ev->i4, ev->i1 == 2); +	    break; +	} +	case EV_PAGE: +	{ +	    struct vt_page *vtp = ev->p1; + +	    if (0) +		if (vtp->errors) +		    printf("errors=%4d\n",vtp->errors); +	    if (w->searching || not(w->hold || ev->i1)) +		if (vtp->pgno == w->pgno) +		    if (w->subno == ANY_SUB || vtp->subno == w->subno) +		{ +			w->searching = 0; +			w->vtp = vtp; +			put_head_line(w, vtp->data[0]); +			for (i = 1; i < 24; ++i) +			    xio_put_line(w->xw, i, vtp->data[i]); +			put_menu_line(w); +			set_title(w); +		} +	    break; +	} +	case EV_HEADER: +	{ +	    u8 *p = ev->p1; +	    int hdr_mag = ev->i1 / 256; +	    int flags = ev->i3; +	    int mag = w->pgno; +	    if (mag >= 0x10) +		mag = mag >> 4; +	    if (mag >= 0x10) +		mag = mag >> 4; +	    if (flags & PG_OUTOFSEQ) +		p = 0; +	    else +		if (~flags & PG_MAGSERIAL) +		    if (mag != hdr_mag) +			p = 0; + +	    put_head_line(w, p); +	    break; +	} +	case EV_XPACKET: +	{ +#if 0 /* VPS data (seems to be unused in .de */ +	    u8 *p = ev->p1; + +	    if (ev->i1 == 8 && ev->i2 == 30 && p[0]/2 == 1) +	    { +		int i; +		int pil, cni, pty, misc; + +		for (i = 7; i < 20; ++i) +		    p[i] = hamm8(p+i, &ev->i3); +		if (ev->i3 & 0xf000)	/* uncorrectable errors */ +		    break; +		cni = p[9] + p[15]/4*16 + p[16]%4*64 + p[10]%4*256 +					+ p[16]/4*1024 + p[17]*4096; +		pty = p[18] + p[19]*16; +		pil = p[10]/4 + p[11]*4 + p[12]*64 + p[13]*1024 +					+ p[14]*16384 + p[15]%4*262144; +		misc = p[7] + p[8]*16; +		err(w, "%02x %04x %05x %02x: %.20s", misc, cni, pil, pty, p+20); +	    } +#endif +	    break; +	} +	case EV_ERR: +	{ +	    char *errmsg = ev->p1; +	    if (errmsg != NULL && *errmsg != '\0') +	    { +	    	err(w, errmsg); +	    	w->status = 30; +	    	ev->p1 = NULL; +	    	free(errmsg); +	    } +	    break; +	} +    } +} diff --git a/util/alevt/ui.h b/util/alevt/ui.h new file mode 100644 index 0000000..9efc791 --- /dev/null +++ b/util/alevt/ui.h @@ -0,0 +1,35 @@ +#ifndef UI_H +#define UI_H + +#include "vt.h" +#include "xio.h" +#include "vbi.h" +#include "search.h" + +#define N_HISTORY (1 << 6) // number of history entries + +struct vtwin +{ +    struct vtwin *parent, *child; +    struct xio_win *xw; +    struct vbi *vbi; +    struct { +    int pgno; +    int subno; +    } hist[N_HISTORY]; +    int hist_top; +    int searching; +    int revealed; +    int hold; +    int pgno, subno; +    struct vt_page *vtp; +    struct search *search; +    int searchdir; +    int status; +    u8 statusline[W+1]; +    struct export *export; +}; + +extern struct vtwin *vtwin_new(struct xio *xio, struct vbi *vbi, char *geom, +    struct vtwin *parent, int pgno, int subno); +#endif diff --git a/util/alevt/vbi.c b/util/alevt/vbi.c new file mode 100644 index 0000000..6a8a47e --- /dev/null +++ b/util/alevt/vbi.c @@ -0,0 +1,942 @@ +#define _GNU_SOURCE +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <stdio.h> +#include <errno.h> +#include <stdarg.h> +#include <sys/ioctl.h> +#include <sys/poll.h> +#include "os.h" +#include "vt.h" +#include "misc.h" +#include "vbi.h" +#include "fdset.h" +#include "hamm.h" +#include "lang.h" +#include <libzvbi.h> + + +static vbi_capture      * pZvbiCapt; +static vbi_raw_decoder  * pZvbiRawDec; +static vbi_sliced       * pZvbiData; +static vbi_proxy_client * pProxy; + +#define ZVBI_BUFFER_COUNT  10 +#define ZVBI_TRACE          0 + + +static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name, +	const char *channel, char *outfile, u_int16_t sid, int ttpid); +static void dvb_handler(struct vbi *vbi, int fd); + +#define FAC (1<<16) // factor for fix-point arithmetic + +static u8 *rawbuf; // one common buffer for raw vbi data +static int rawbuf_size; // its current size +u_int16_t sid; +static char *vbi_names[] +	= { "/dev/vbi", "/dev/vbi0", "/dev/video0", "/dev/dvb/adapter0/demux0", +	NULL }; // default device names if none was given at the command line + + +static void out_of_sync(struct vbi *vbi) +{ +    int i; // discard all in progress pages +    for (i = 0; i < 8; ++i) +    vbi->rpage[i].page->flags &= ~PG_ACTIVE; +} + + +// send an event to all clients +static void vbi_send(struct vbi *vbi, int type, int i1, int i2, int i3, void *p1) +{ +    struct vt_event ev[1]; +    struct vbi_client *cl, *cln; +    ev->resource = vbi; +    ev->type = type; +    ev->i1 = i1; +    ev->i2 = i2; +    ev->i3 = i3; +    ev->p1 = p1; +    for (cl = PTR vbi->clients->first; cln = PTR cl->node->next; cl = cln) +    cl->handler(cl->data, ev); +} + + +static void vbi_send_page(struct vbi *vbi, struct raw_page *rvtp, int page) +{ +    struct vt_page *cvtp = 0; + +    if (rvtp->page->flags & PG_ACTIVE) +    { +    if (rvtp->page->pgno % 256 != page) +    { +    rvtp->page->flags &= ~PG_ACTIVE; +    enhance(rvtp->enh, rvtp->page); +    if (vbi->cache) +    cvtp = vbi->cache->op->put(vbi->cache, rvtp->page); +    vbi_send(vbi, EV_PAGE, 0, 0, 0, cvtp ?: rvtp->page); +    } +    } +} + + +static void pll_add(struct vbi *vbi, int n, int err) +{ +} + + +// process one videotext packet +static int vt_line(struct vbi *vbi, u8 *p) +{ +    struct vt_page *cvtp; +    struct raw_page *rvtp; +    int hdr, mag, mag8, pkt, i; +    int err = 0; + +    hdr = hamm16(p, &err); +    if (err & 0xf000) +    return -4; +    mag = hdr & 7; +    mag8 = mag?: 8; +    pkt = (hdr >> 3) & 0x1f; +    p += 2; +    rvtp = vbi->rpage + mag; +    cvtp = rvtp->page; +    switch (pkt) +    { +	case 0: +	{ +	    int b1, b2, b3, b4; +	    b1 = hamm16(p, &err); // page number +	    b2 = hamm16(p+2, &err); // subpage number + flags +	    b3 = hamm16(p+4, &err); // subpage number + flags +	    b4 = hamm16(p+6, &err); // language code + more flags +	    if (vbi->ppage->page->flags & PG_MAGSERIAL) +		vbi_send_page(vbi, vbi->ppage, b1); +	    vbi_send_page(vbi, rvtp, b1); + +	    if (err & 0xf000) +		return 4; + +	    cvtp->errors = (err >> 8) + chk_parity(p + 8, 32);; +	    cvtp->pgno = mag8 * 256 + b1; +	    cvtp->subno = (b2 + b3 * 256) & 0x3f7f; +	    cvtp->lang = "\0\4\2\6\1\5\3\7"[b4 >> 5] + (latin1==LATIN1 ? 0 : 8); +	    cvtp->flags = b4 & 0x1f; +	    cvtp->flags |= b3 & 0xc0; +	    cvtp->flags |= (b2 & 0x80) >> 2; +	    cvtp->lines = 1; +	    cvtp->flof = 0; +	    vbi->ppage = rvtp; +	    pll_add(vbi, 1, cvtp->errors); +	    conv2latin(p + 8, 32, cvtp->lang); +	    vbi_send(vbi, EV_HEADER, cvtp->pgno, cvtp->subno, cvtp->flags, p); + +	    if (b1 == 0xff) +	    return 0; +	    cvtp->flags |= PG_ACTIVE; +	    init_enhance(rvtp->enh); +	    memcpy(cvtp->data[0]+0, p, 40); +	    memset(cvtp->data[0]+40, ' ', sizeof(cvtp->data)-40); +	    return 0; +	} + +	case 1 ... 24: +	{ +	    pll_add(vbi, 1, err = chk_parity(p, 40)); + +	    if (~cvtp->flags & PG_ACTIVE) +		return 0; + +	    cvtp->errors += err; +	    cvtp->lines |= 1 << pkt; +	    conv2latin(p, 40, cvtp->lang); +	    memcpy(cvtp->data[pkt], p, 40); +	    return 0; +	} +	case 26: +	{ +	    int d, t[13]; + +	    if (~cvtp->flags & PG_ACTIVE) +		return 0; + +	    d = hamm8(p, &err); +	    if (err & 0xf000) +		return 4; + +	    for (i = 0; i < 13; ++i) +		t[i] = hamm24(p + 1 + 3*i, &err); +	    if (err & 0xf000) +		return 4; + +	    add_enhance(rvtp->enh, d, t); +	    return 0; +	} +	case 27: +	{ +	    int b1,b2,b3,x; +	    if (~cvtp->flags & PG_ACTIVE) +		return 0; // -1 flushes all pages. We may never resync again + +	    b1 = hamm8(p, &err); +	    b2 = hamm8(p + 37, &err); +	    if (err & 0xf000) +		return 4; +	    if (b1 != 0 || not(b2 & 8)) +		return 0; + +	    for (i = 0; i < 6; ++i) +	    { +		err = 0; +		b1 = hamm16(p+1+6*i, &err); +		b2 = hamm16(p+3+6*i, &err); +		b3 = hamm16(p+5+6*i, &err); +		if (err & 0xf000) +		    return 1; +		x = (b2 >> 7) | ((b3 >> 5) & 0x06); +		cvtp->link[i].pgno = ((mag ^ x) ?: 8) * 256 + b1; +		cvtp->link[i].subno = (b2 + b3 * 256) & 0x3f7f; +	    } +	    cvtp->flof = 1; +	    return 0; +	} +	case 30: +	{ +	    if (mag8 != 8) +	    return 0; +	    p[0] = hamm8(p, &err); // designation code +	    p[1] = hamm16(p+1, &err); // initial page +	    p[3] = hamm16(p+3, &err); // initial subpage + mag +	    p[5] = hamm16(p+5, &err); // initial subpage + mag +	    if (err & 0xf000) +	    return 4; +	    err += chk_parity(p+20, 20); +	    conv2latin(p+20, 20, 0); +	    vbi_send(vbi, EV_XPACKET, mag8, pkt, err, p); +	    return 0; +	} +	default: +	    return 0; +    } +    return 0; +} + + +// called when new vbi data is waiting +static void vbi_handler(struct vbi *vbi, int fd) +{ +    double timestamp; +    struct timeval timeout; +    int lineCount; +    int line; +    int res; + +    timeout.tv_sec  = 0; +    timeout.tv_usec = 25000; +    res = vbi_capture_read_sliced(pZvbiCapt, pZvbiData, &lineCount, ×tamp, +    &timeout); +    if (res > 0) +    { +	for (line=0; line < lineCount; line++) +	{ +            if ((pZvbiData[line].id & VBI_SLICED_TELETEXT_B) != 0) +	    { +		vt_line(vbi, pZvbiData[line].data); +	    } +	} +    } +    else if (res < 0) +    { +    } +} + + +int vbi_add_handler(struct vbi *vbi, void *handler, void *data) +{ +    struct vbi_client *cl; + +    if (not(cl = malloc(sizeof(*cl)))) +    return -1; +    cl->handler = handler; +    cl->data = data; +    dl_insert_last(vbi->clients, cl->node); +    return 0; +} + + +void vbi_del_handler(struct vbi *vbi, void *handler, void *data) +{ +    struct vbi_client *cl; + +    for (cl = PTR vbi->clients->first; cl->node->next; cl = PTR cl->node->next) +	if (cl->handler == handler && cl->data == data) +	{ +	    dl_remove(cl->node); +	    break; +	} +    return; +} + + +struct vbi * vbi_open(char *vbi_name, struct cache *ca, +	const char *channel, char *outfile, u_int16_t sid, int ttpid) +{ +    static int inited = 0; +    struct vbi *vbi; +    char * pErrStr; +    int services; + +    if (vbi_name == NULL) +    { +        int i; +        char *tried_devices = NULL; +        char *old_tried_devices = NULL; +        for (i = 0; vbi_names[i] != NULL; i++) +        { +        vbi_name = vbi_names[i]; +        // collect device names for the error message below +        if (old_tried_devices) +        { +        if (asprintf(&tried_devices, "%s, %s", old_tried_devices, vbi_name) < 0) +        tried_devices = NULL; +        free(old_tried_devices); +        } +        else if (asprintf(&tried_devices, "%s", vbi_name) < 0) +        tried_devices = NULL; +        if (tried_devices == NULL) +        out_of_mem(-1); +        old_tried_devices = tried_devices; +        if (access(vbi_name, R_OK) != 0) +        continue; +        vbi = vbi_open(vbi_name, ca, channel, outfile, sid, ttpid); +        if (vbi != NULL) +        { +        if (tried_devices != NULL) +        free(tried_devices); +        return vbi; +        } +        } + +	error("could not open any of the standard devices (%s)", tried_devices); +        free(tried_devices); +	return NULL; +    } + +    if (not inited) +    lang_init(); +    inited = 1; + +    if (not(vbi = malloc(sizeof(*vbi)))) +    { +	error("out of memory"); +	goto fail1; +    } +    if (!vbi_dvb_open(vbi, vbi_name, channel, outfile, sid, ttpid)) { +	    vbi->cache = ca; +	    dl_init(vbi->clients); +	    out_of_sync(vbi); +	    vbi->ppage = vbi->rpage; +	    fdset_add_fd(fds, vbi->fd, dvb_handler, vbi); +	    return vbi; +    } + +    services = VBI_SLICED_TELETEXT_B; +    pErrStr = NULL; +    vbi->fd = -1; + +    pProxy = vbi_proxy_client_create(vbi_name, "alevt", +    VBI_PROXY_CLIENT_NO_STATUS_IND, &pErrStr, ZVBI_TRACE); +    if (pProxy != NULL) +    { +       pZvbiCapt = vbi_capture_proxy_new(pProxy, ZVBI_BUFFER_COUNT, 0, +       &services, 0, &pErrStr); +       if (pZvbiCapt == NULL) +       { +          vbi_proxy_client_destroy(pProxy); +          pProxy = NULL; +       } +    } +    if (pZvbiCapt == NULL) +        pZvbiCapt = vbi_capture_v4l2_new(vbi_name, ZVBI_BUFFER_COUNT, +        &services, 0, &pErrStr, ZVBI_TRACE); +    if (pZvbiCapt == NULL) +        pZvbiCapt = vbi_capture_v4l_new(vbi_name, 0, &services, 0, &pErrStr, +        ZVBI_TRACE); + +    if (pZvbiCapt != NULL) +    { +        pZvbiRawDec = vbi_capture_parameters(pZvbiCapt); +        if ((pZvbiRawDec != NULL) && ((services & VBI_SLICED_TELETEXT_B) != 0)) +        { +            pZvbiData = malloc((pZvbiRawDec->count[0] + pZvbiRawDec->count[1]) \ +            * sizeof(*pZvbiData)); + +            vbi->fd = vbi_capture_fd(pZvbiCapt); +        } +        else +            vbi_capture_delete(pZvbiCapt); +    } + +    if (pErrStr != NULL) +    { +        fprintf(stderr, "libzvbi: %s\n", pErrStr); +        free(pErrStr); +    } + +    if (vbi->fd == -1) +        goto fail2; +    vbi->cache = ca; +    dl_init(vbi->clients); +    out_of_sync(vbi); +    vbi->ppage = vbi->rpage; +    fdset_add_fd(fds, vbi->fd, vbi_handler, vbi); +    return vbi; + +fail3: +    close(vbi->fd); +fail2: +    free(vbi); +fail1: +    return 0; +} + + +void vbi_close(struct vbi *vbi) +{ +    fdset_del_fd(fds, vbi->fd); +    if (vbi->cache) +    vbi->cache->op->close(vbi->cache); + +    if (pZvbiData != NULL) +	free(pZvbiData); +    pZvbiData = NULL; + +    if (pZvbiCapt != NULL) +    { +	vbi_capture_delete(pZvbiCapt); +       pZvbiCapt = NULL; +    } +    if (pProxy != NULL) +    { +       vbi_proxy_client_destroy(pProxy); +       pProxy = NULL; +    } +    free(vbi); +} + + +struct vt_page * vbi_query_page(struct vbi *vbi, int pgno, int subno) +{ +    struct vt_page *vtp = 0; +    if (vbi->cache) +    vtp = vbi->cache->op->get(vbi->cache, pgno, subno); +    if (vtp == 0) +    { +    return 0; +    } +    vbi_send(vbi, EV_PAGE, 1, 0, 0, vtp); +    return vtp; +} + + +void vbi_reset(struct vbi *vbi) +{ +    if (vbi->cache) +    vbi->cache->op->reset(vbi->cache); +    vbi_send(vbi, EV_RESET, 0, 0, 0, 0); +} + + +/* Starting from here: DVB API */ +#include <linux/dvb/dmx.h> +#include <linux/dvb/frontend.h> +#include <linux/dvb/video.h> + +static int dvb_get_table(int fd, u_int16_t pid, u_int8_t tblid, u_int8_t *buf, +	size_t bufsz) +{ +    struct dmx_sct_filter_params sctFilterParams; +    struct pollfd pfd; +    int r; +    memset(&sctFilterParams, 0, sizeof(sctFilterParams)); +    sctFilterParams.pid = pid; +    sctFilterParams.timeout = 10000; +    sctFilterParams.flags = DMX_ONESHOT | DMX_IMMEDIATE_START | DMX_CHECK_CRC; +    sctFilterParams.filter.filter[0] = tblid; +    sctFilterParams.filter.mask[0] = 0xff; +    if (ioctl(fd, DMX_SET_FILTER, &sctFilterParams)) { +		perror("DMX_SET_FILTER"); +		return -1; +	} +	pfd.fd = fd; +	pfd.events = POLLIN; +	r = poll(&pfd, 1, 10000); +	if (r < 0) { +		perror("poll"); +		goto out; +	} +	if (r > 0) { +		r = read(fd, buf, bufsz); +		if (r < 0) { +			perror("read"); +			goto out; +		} +	} + out: +	ioctl(fd, DMX_STOP, 0); +	return r; +} + +static const u_int8_t byterev8[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 +}; + +static void dvb_handle_pes_payload(struct vbi *vbi, const u_int8_t *buf, +	unsigned int len) +{ +	unsigned int p, i; +	u_int8_t data[42]; + +	if (buf[0] < 0x10 || buf[0] > 0x1f) +		return;  /* no EBU teletext data */ +	for (p = 1; p < len; p += /*6 + 40*/ 2 + buf[p + 1]) { +#if 0 +	printf("Txt Line:\n" +	       "  data_unit_id		   0x%02x\n" +	       "  data_unit_length	   0x%02x\n" +	       "  reserved_for_future_use  0x%01x\n" +	       "  field_parity		   0x%01x\n" +	       "  line_offset		   0x%02x\n" +	       "  framing_code		   0x%02x\n" +	       "  magazine_and_packet_addr 0x%04x\n" +	       "  data_block		   0x%02x 0x%02x 0x%02x 0x%02x\n", +	       buf[p], buf[p+1], +	       buf[p+2] >> 6, +	       (buf[p+2] >> 5) & 1, +	       buf[p+2] & 0x1f, +	       buf[p+3], +	       (buf[p+4] << 8) | buf[p+5], +	       buf[p+6], buf[p+7], buf[p+8], buf[p+9]); +#endif +		for (i = 0; i < sizeof(data); i++) +			data[i] = byterev8[buf[p+4+i]]; +		/* note: we should probably check for missing lines and then +		 * call out_of_sync(vbi); and/or vbi_reset(vbi); */ +		vt_line(vbi, data); +	} +} + +static unsigned int rawptr; + +static void dvb_handler(struct vbi *vbi, int fd) +{ +	/* PES packet start code prefix and stream_id == private_stream_1 */ +	static const u_int8_t peshdr[4] = { 0x00, 0x00, 0x01, 0xbd }; +	u_int8_t *bp; +	int n; +	unsigned int p, i, len; +        u_int16_t rpid; +        u_int32_t crc, crccomp; + +	if (rawptr >= (unsigned int)rawbuf_size) +		rawptr = 0; +	n = read(vbi->fd, rawbuf + rawptr, rawbuf_size - rawptr); +	if (n <= 0) +		return; +	rawptr += n; +	if (rawptr < 6) +		return; +	if (memcmp(rawbuf, peshdr, sizeof(peshdr))) { +		bp = memmem(rawbuf, rawptr, peshdr, sizeof(peshdr)); +		if (!bp) +			return; +		rawptr -= (bp - rawbuf); +		memmove(rawbuf, bp, rawptr); +		if (rawptr < 6) +			return; +	} +	len = (rawbuf[4] << 8) | rawbuf[5]; +	if (len < 9) { +		rawptr = 0; +		return; +	} +	if (rawptr < len + 6) +		return; +	p = 9 + rawbuf[8]; +#if 0 +	for (i = 0; i < len - p; i++) { +		if (!(i & 15)) +			printf("\n%04x:", i); +		printf(" %02x", rawbuf[p + i]); +	} +	printf("\n"); +#endif +	if (!dl_empty(vbi->clients)) +		dvb_handle_pes_payload(vbi, rawbuf + p, len - p); +	rawptr -= len; +	if (rawptr) +		memmove(rawbuf, rawbuf + len, rawptr); +} + + +static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name, +	const char *channel, char *outfile, u_int16_t sid, int ttpid) +{ +	struct { +		u_int16_t pmtpid; +		u_int16_t ttpid; +		u_int16_t service_id; +		u_int8_t service_type; +		char service_provider_name[64]; +		char service_name[64]; +		u_int8_t txtlang[3]; +		u_int8_t txttype; +		u_int8_t txtmagazine; +		u_int8_t txtpage; +	} progtbl[16], *progp; +	u_int8_t tbl[4096]; +	u_int8_t * ppname, * psname, pncode, sncode, pnlen, snlen; +	int r; +	FILE *ofd; +	unsigned int i, j, k, l, progcnt = 0; +	struct dmx_pes_filter_params filterpar; + +	/* open DVB demux device */ +	if (!vbi_name) +		vbi_name = "/dev/dvb/adapter0/demux0"; +	if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) { +		error("cannot open demux device %s", vbi_name); +		return -1; +	} +	memset(progtbl, 0, sizeof(progtbl)); +	if (ttpid >= 0x15 && ttpid < 0x1fff) { +		vbi->ttpid = ttpid; +		printf("Using command line specified teletext PID 0x%x\n", +		vbi->ttpid); +		goto ttpidfound; +	} +	/* parse PAT to enumerate services and to find the PMT PIDs */ +	r = dvb_get_table(vbi->fd, 0, 0, tbl, sizeof(tbl)); +	if (r == -1) +		goto outerr; +	if (!(tbl[5] & 1)) { +		error("PAT not active (current_next_indicator == 0)"); +		goto outerr; +	} +	if (tbl[6] != 0 || tbl[7] != 0) { +		error("PAT has multiple sections"); +		goto outerr; +	} +	if (r < 13) { +		error("PAT too short\n"); +		goto outerr; +	} +	r -= 13; +	for (i = 0; i < (unsigned)r; i += 4) { +		if (progcnt >= sizeof(progtbl)/sizeof(progtbl[0])) { +			error("Program table overflow"); +			goto outerr; +		} +		progtbl[progcnt].service_id = (tbl[8 + i] << 8) | tbl[9 + i]; +		if (!progtbl[progcnt].service_id) /* this is the NIT pointer */ +			continue; +		progtbl[progcnt].pmtpid = ((tbl[10 + i] << 8) | tbl[11 + i]) +		& 0x1fff; +		progcnt++; +	} +	/* find the SDT to get the station names */ +	r = dvb_get_table(vbi->fd, 0x11, 0x42, tbl, sizeof(tbl)); +	if (r == -1) +		goto outerr; +	if (!(tbl[5] & 1)) { +		error("SDT not active (current_next_indicator == 0)"); +		goto outerr; +	} +	if (tbl[6] != 0 || tbl[7] != 0) { +		error("SDT has multiple sections"); +		goto outerr; +	} +	if (r < 12) { +		error("SDT too short\n"); +		goto outerr; +	} +	i = 11; +	while (i < (unsigned)r - 1) { +		k = (tbl[i] << 8) | tbl[i+1]; /* service ID */ +		progp = NULL; +		for (j = 0; j < progcnt; j++) +			if (progtbl[j].service_id == k) { +				progp = &progtbl[j]; +				break; +			} +		j = i + 5; +		i = j + (((tbl[i+3] << 8) | tbl[i+4]) & 0x0fff); +		if (!progp) { +			error("SDT: service_id 0x%x not in PAT\n", k); +			continue; +		} +         while (j < i) { +            switch (tbl[j]) { +               case 0x48: // service descriptor +                  k = j + 4 + tbl[j + 3]; +                  progp->service_type = tbl[j+2]; +                  ppname = tbl+j+4 ; // points to 1st byte of provider_name +                  pncode = *ppname ; // 1st byte of provider_name +                  pnlen = tbl[j+3]; // length of provider_name +                  psname = tbl+k+1 ; // points to 1st byte of service_name +                  sncode = *psname ; // 1st byte of service_name +                  snlen = tbl[k]  ; // length of service_name +                  if (pncode >= 0x20) { +                     pncode = 0 ; // default character set Latin alphabet fig.A.1 +                  } else { +                     ppname++ ; pnlen-- ; +                     // character code from table A.3 1st byte = ctrl-code +                  } +                  if (sncode >= 0x20) { +                     sncode = 0 ; // default character set Latin alphabet fig.A.1 +                  } else { +                     psname++ ; snlen-- ; +                     // character code from table A.3 ; 1st byte = ctrl-code +                  } +                  snprintf(progp->service_provider_name, +                  sizeof(progp->service_provider_name), "%.*s", pnlen, ppname); +                  snprintf(progp->service_name, +                  sizeof(progp->service_name), "%.*s", snlen, psname); break; +            } +            j += 2 + tbl[j + 1]; // next descriptor +         } +      } +	/* parse PMT's to find Teletext Services */ +	for (l = 0; l < progcnt; l++) { +		progtbl[l].ttpid = 0x1fff; +		if (progtbl[l].service_type != 0x01 || /* not digital TV */ +		    progtbl[l].pmtpid < 0x15 || /* PMT PID sanity check */ +		    progtbl[l].pmtpid >= 0x1fff) +			continue; +		r = dvb_get_table(vbi->fd, progtbl[l].pmtpid, 0x02, tbl, +		sizeof(tbl)); +		if (r == -1) +			goto outerr; +		if (!(tbl[5] & 1)) { error \ +		("PMT pid 0x%x not active (current_next_indicator == 0)", +		progtbl[l].pmtpid); +			goto outerr; +		} +		if (tbl[6] != 0 || tbl[7] != 0) { +			error("PMT pid 0x%x has multiple sections", +			progtbl[l].pmtpid); +			goto outerr; +		} +		if (r < 13) { +			error("PMT pid 0x%x too short\n", progtbl[l].pmtpid); +			goto outerr; +		} +		i = 12 + (((tbl[10] << 8) | tbl[11]) & 0x0fff); +		/* skip program info section */ +		while (i <= (unsigned)r-6) { +			j = i + 5; +			i = j + (((tbl[i + 3] << 8) | tbl[i + 4]) & 0x0fff); +			if (tbl[j - 5] != 0x06) +			/* teletext streams have type 0x06 */ +				continue; +			k = ((tbl[j - 4] << 8) | tbl[j - 3]) & 0x1fff; +		/* elementary PID - save until we know if it's teletext PID */ +			while (j < i) { +				switch (tbl[j]) { +				case 0x56: /* EBU teletext descriptor */ +					progtbl[l].txtlang[0] = tbl[j + 2]; +					progtbl[l].txtlang[1] = tbl[j + 3]; +					progtbl[l].txtlang[2] = tbl[j + 4]; +					progtbl[l].txttype = tbl[j + 5] >> 3; +					progtbl[l].txtmagazine = tbl[j + 5] & 7; +					progtbl[l].txtpage = tbl[j + 6]; +					progtbl[l].ttpid = k; +					break; +				} +				j += 2 + tbl[j + 1]; +			} +		} +	} + +    printf \ +    ("sid:pmtpid:ttpid:type:provider:name:language:texttype:magazine:page\n\n"); +    for (i = 0; i < progcnt; i++) { +    printf("%d:%d:%d:%d:%s:%s:lang=%.3s:type=%d:magazine=%1u:page=%3u\n", +    progtbl[i].service_id, progtbl[i].pmtpid, progtbl[i].ttpid, +    progtbl[i].service_type, progtbl[i].service_provider_name, +    progtbl[i].service_name, progtbl[i].txtlang, progtbl[i].txttype, +    progtbl[i].txtmagazine, progtbl[i].txtpage); +    } + +    if (*outfile) { +    ofd = fopen(outfile,"w") ; +    if (ofd == NULL) { error("cannot open outfile\n"); goto outerr ; } +    for (i = 0; i < progcnt; i++) { +    if (progtbl[i].ttpid == 0x1fff) continue ; // service without teletext +    fprintf(ofd,"%d:%d:%s:%s:lang=%.3s\n", +    progtbl[i].service_id, progtbl[i].ttpid, progtbl[i].service_provider_name, +    progtbl[i].service_name, progtbl[i].txtlang); +    } +    fclose(ofd) ; + } + +	progp = NULL; + +	if (channel) { +		j = strlen(channel); +		for (i = 0; i < progcnt; i++) +			if (!strncmp(progtbl[i].service_name, channel, j) +			&& progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i]; +				break ; +			} +	} + +	if (channel && !progp) { +		j = strlen(channel); +		for (i = 0; i < progcnt; i++) +			if (!strncasecmp(progtbl[i].service_name, channel, j) +			&& progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i]; +				break ; +			} +	} + +    if (sid) { +    for (i = 0; i < progcnt; i++) { +    if ((progtbl[i].service_id == sid) && (progtbl[i].ttpid != 0x1fff)) { +            progp = &progtbl[i]; break ; } +            } +    } + +    if (!progp) { +		for (i = 0; i < progcnt; i++) +			if (progtbl[i].ttpid != 0x1fff) { +				progp = &progtbl[i]; break ; +			} +	} + +    printf("\nUsing: Service ID = %d ; PMT PID = %d ; TXT PID = %d ;\n" +    "Service type = %d ; Provider Name = %s ; Service name = %s ;\n" +    "language = %.3s ; Text type = %d ; Text Magazine = %1u ; Text page = %3u\n", +    progp->service_id, progp->pmtpid, progp->ttpid, progp->service_type, +    progp->service_provider_name, progp->service_name, progp->txtlang, +    progp->txttype, progp->txtmagazine, progp->txtpage); +    vbi->ttpid = progp->ttpid; + + ttpidfound: +	rawbuf = malloc(rawbuf_size = 8192); +	if (!rawbuf) +		goto outerr; +	rawptr = 0; +#if 0 +	close(vbi->fd); +	if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) { +		error("cannot open demux device %s", vbi_name); +		return -1; +	} +#endif +	memset(&filterpar, 0, sizeof(filterpar)); +	filterpar.pid = vbi->ttpid; +        filterpar.input = DMX_IN_FRONTEND; +        filterpar.output = DMX_OUT_TAP; +        filterpar.pes_type = DMX_PES_OTHER; +        filterpar.flags = DMX_IMMEDIATE_START; +        if (ioctl(vbi->fd, DMX_SET_PES_FILTER, &filterpar) < 0) { +        error("ioctl: DMX_SET_PES_FILTER %s (%u)", strerror(errno), errno); +        goto outerr; +        } +	return 0; + + outerr: +	close(vbi->fd); +	vbi->fd = -1; +	return -1; +} + + +struct vbi *open_null_vbi(struct cache *ca) +{ +    static int inited = 0; +    struct vbi *vbi; + +    if (not inited) +    lang_init(); +    inited = 1; + +    vbi = malloc(sizeof(*vbi)); +    if (!vbi) +    { +		error("out of memory"); +		goto fail1; +    } + +    vbi->fd = open("/dev/null", O_RDONLY); +	if (vbi->fd == -1) +	{ +		error("cannot open null device"); +		goto fail2; +	} + +    vbi->ttpid = -1; +    out_of_sync(vbi); +    vbi->ppage = vbi->rpage; +    fdset_add_fd(fds, vbi->fd, vbi_handler, vbi); +    return vbi; + +fail3: +    close(vbi->fd); +fail2: +    free(vbi); +fail1: +    return 0; +} + + +void send_errmsg(struct vbi *vbi, char *errmsg, ...) +{ +	va_list args; +	if (errmsg == NULL || *errmsg == '\0') +		return; +	va_start(args, errmsg); +	char *buff = NULL; +	if (vasprintf(&buff, errmsg, args) < 0) +		buff = NULL; +	va_end(args); +	if(buff == NULL) +		out_of_mem(-1); +	vbi_send(vbi, EV_ERR, 0, 0, 0, buff); +} diff --git a/util/alevt/vbi.h b/util/alevt/vbi.h new file mode 100644 index 0000000..edb9dab --- /dev/null +++ b/util/alevt/vbi.h @@ -0,0 +1,47 @@ +#ifndef VBI_H +#define VBI_H + +#include "vt.h" +#include "dllist.h" +#include "cache.h" +#include "lang.h" + +#define PLL_ADJUST 4 + +struct raw_page +{ +    struct vt_page page[1]; +    struct enhance enh[1]; +}; + +struct vbi +{ +    int fd; +    struct cache *cache; +    struct dl_head clients[1]; +    // page assembly +    struct raw_page rpage[8]; // one for each magazin +    struct raw_page *ppage; // points to page of previous pkt0 +    // DVB stuff +    unsigned int ttpid; +    u_int16_t sid; +}; + +struct vbi_client +{ +    struct dl_node node[1]; +    void (*handler)(void *data, struct vt_event *ev); +    void *data; +}; + +struct vbi *vbi_open(char *vbi_dev_name, struct cache *ca, +	const char *channel, char *outfile, u_int16_t sid, int ttpid); +void vbi_close(struct vbi *vbi); +void vbi_reset(struct vbi *vbi); +int vbi_add_handler(struct vbi *vbi, void *handler, void *data); +void vbi_del_handler(struct vbi *vbi, void *handler, void *data); +struct vt_page *vbi_query_page(struct vbi *vbi, int pgno, int subno); + +struct vbi *open_null_vbi(struct cache *ca); +void send_errmsg(struct vbi *vbi, char *errmsg, ...); +#endif diff --git a/util/alevt/vt.h b/util/alevt/vt.h new file mode 100644 index 0000000..75986e8 --- /dev/null +++ b/util/alevt/vt.h @@ -0,0 +1,62 @@ +#ifndef VT_H +#define VT_H + +#include "misc.h" + +#define W 40 +#define H 25 +#define BAD_CHAR 0xb8 // substitute for chars with bad parity + +struct vt_event +{ +    int type; +    void *resource;	/* struct xio_win *, struct vbi *, ... */ +    int i1, i2, i3, i4; +    void *p1; +}; + +#define EV_CLOSE	1 +#define EV_KEY		2	// i1:KEY_xxx  i2:shift-flag +#define EV_MOUSE	3	// i1:button  i2:shift-flag i3:x  i4:y +#define EV_SELECTION	4	// i1:len  p1:data +#define EV_PAGE		5	// p1:vt_page i1:query-flag +#define EV_HEADER	6	// i1:pgno  i2:subno  i3:flags  p1:data +#define EV_XPACKET	7	// i1:mag  i2:pkt  i3:errors  p1:data +#define EV_RESET	8	// ./. +#define EV_TIMER	9	// ./. +#define EV_ERR		10	// p1: errmsg +#define KEY_F(i)	(1000+i) +#define KEY_LEFT	2001 +#define KEY_RIGHT	2002 +#define KEY_UP		2003 +#define KEY_DOWN	2004 +#define KEY_PUP		2005 +#define KEY_PDOWN	2006 +#define KEY_DEL		2007 +#define KEY_INS		2008 + +struct vt_page +{ +    int pgno, subno;	// the wanted page number +    int lang;		// language code +    int flags;		// misc flags (see PG_xxx below) +    int errors;		// number of single bit errors in page +    u32 lines;		// 1 bit for each line received +    u8 data[25][40];	// page contents +    int flof;		// page has FastText links +    struct { +    int pgno; +    int subno; +    } link[6]; // FastText links (FLOF) +}; + +#define PG_SUPPHEADER	0x01	// C7  row 0 is not to be displayed +#define PG_OUTOFSEQ	0x04	// C9  page out of numerical order +#define PG_NODISPLAY	0x08	// C10 rows 1-24 is not to be displayed +#define PG_MAGSERIAL	0x10	// C11 serial trans. (any pkt0 terminates page) +#define PG_ERASE	0x20	// C4  clear previously stored lines +#define PG_NEWSFLASH	0x40	// C5  box it and insert into normal video pict. +#define PG_SUBTITLE	0x80	// C6  box it and insert into normal video pict. +#define PG_ACTIVE	0x100	// currently fetching this page +#define ANY_SUB		0x3f7f	// universal subpage number +#endif diff --git a/util/alevt/vt900.out b/util/alevt/vt900.out new file mode 100644 index 0000000..558ee67 --- /dev/null +++ b/util/alevt/vt900.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System         ", +"  \22`p0`0    p `0pppp                     ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!              ", +#else +HELP_HEADER +#endif +"                                           ", +"\6\15Contents:                             ", +"\6\15Contents:                             ", +"\24 ####################################   ", +"                                           ", +"   \3\177\6Starting alevt . . . . . . 902  ", +"                                           ", +"   \3\177\6Copying/Warranty . . . . . 904  ", +"                                           ", +"   \3\177\6The Status Line  . . . . . 905  ", +"                                           ", +"   \3\177\6Selecting Pages  . . . . . 907  ", +"                                           ", +"   \3\177\6QuickClick Page  . . . . . 915  ", +"                                           ", +"\24 pppppppppppppppppppppppppppppppppppp   ", +"              (Click to select a page)     ", +"                                           ", +"\4\35\7                           Next 901 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt901.out b/util/alevt/vt901.out new file mode 100644 index 0000000..1bde77c --- /dev/null +++ b/util/alevt/vt901.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System         ", +"  \22`p0`0    p `0pppp                     ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!              ", +#else +HELP_HEADER +#endif +"                                           ", +"\6\15Contents:                             ", +"\6\15Contents:                             ", +"\24 ####################################   ", +"                                           ", +"\6  \3\177\6FastText Menu  . . . . . . 909 ", +"\6                                         ", +"\6  \3\177\6Keyboard Commands  . . . . 910 ", +"\6                                         ", +"\6  \3\177\6Starting alevt-cap . . . . 912 ", +"\6                                         ", +"\6  \3\177\6Starting alevt-date  . . . 914 ", +"\6                                         ", +"\6  \3\177\6QuickClick Page  . . . . . 915 ", +"                                           ", +"\24 pppppppppppppppppppppppppppppppppppp   ", +"              (Click to select a page)     ", +"                                           ", +"\4\35\7Back 900     Index 900     Next 902 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt902.out b/util/alevt/vt902.out new file mode 100644 index 0000000..665b41d --- /dev/null +++ b/util/alevt/vt902.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System         ", +"  \22`p0`0    p `0pppp                     ", +"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5        \7     1.7.0 \34", +"  \22# #\42!\42#   \42   \42!              ", +#else +HELP_HEADER +#endif +"                                           ", +"\6\15Starting alevt:                       ", +"\6\15Starting alevt:                       ", +"\24 ####################################   ", +"\6 $\7alevt\6[options]     Default:        ", +"                                           ", +"    -c\6<channel name>   (none;dvb only)   ", +"    -ch -child\6<ppp.ss> (none)            ", +"    -cs -charset       \6latin-1           ", +"   \6<latin-1/2/koi8-r/                    ", +"   \6iso8859-7>                            ", +"    -h -help                               ", +"                                           ", +"                                           ", +"                                           ", +"\24 pppppppppppppppppppppppppppppppppppp   ", +"                                           ", +"                                           ", +"\4\35\7Back 901     Index 900     Next 903 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt903.out b/util/alevt/vt903.out new file mode 100644 index 0000000..0df75c1 --- /dev/null +++ b/util/alevt/vt903.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System         ", +"  \22`p0`0    p `0pppp                     ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!              ", +#else +HELP_HEADER +#endif +"                                           ", +"\6\15Starting alevt:                       ", +"\6\15Starting alevt:                       ", +"\24 ####################################   ", +"\6 $\7alevt\6[options]     Default:        ", +"    -o\6<outfile>        (none;dvb only)   ", +"    -p -parent\6<ppp.ss> 900               ", +"    -s -sid\6<sid>       (none;dvb only)   ", +"    -t -ttpid\6<ttpid>   (none;dvb only)   ", +"    -v -vbi\6<vbidev>    /dev/vbi          ", +"                       \6/dev/vbi0         ", +"                       \6/dev/video0       ", +"          \6/dev/dvb/adapter0/demux0       ", +"                                           ", +"                                           ", +"\24 pppppppppppppppppppppppppppppppppppp   ", +"                                           ", +"                                           ", +"\4\35\7Back 902     Index 900     Next 904 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt904.out b/util/alevt/vt904.out new file mode 100644 index 0000000..d13dcfd --- /dev/null +++ b/util/alevt/vt904.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System       ", +"  \22`p0`0    p `0pppp                   ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!            ", +#else +HELP_HEADER +#endif +"                                         ", +"\6\15Copying:                            ", +"\6\15Copying:                            ", +"\24 #################################### ", +"\6 2002-07 Edgar Toernig (froese@gmx.de) ", +"\6         All Rights Reserved.          ", +"\6                                       ", +"\6 This program is free software; you    ", +"\6 can redistribute it and/or modify it  ", +"\6 under the terms of the GNU General    ", +"\6 Public License Version 2 as published ", +"\6 by the Free Software Foundation.      ", +"\6                                       ", +"\6 This program is distributed in the    ", +"\6 hope that it will be useful, but      ", +"\6\7without any warranty.\6See the GNU   ", +"\6 General Public License for details.   ", +"                                         ", +"\4\35\7Back 903     Index 900     Next 905 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt905.out b/util/alevt/vt905.out new file mode 100644 index 0000000..b445ebb --- /dev/null +++ b/util/alevt/vt905.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System       ", +"  \22`p0`0    p `0pppp                   ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!            ", +#else +HELP_HEADER +#endif +"                                         ", +"\6\15Status Line:                        ", +"\6\15Status Line:                        ", +"\24 #################################### ", +"\6 The top line of each window is the    ", +"\6 status line. On the left it shows     ", +"\6 the current page number (CPN) and     ", +"\6 some flags. The rest of the line      ", +"\6 is the running header sent by the     ", +"\6 TV station.                           ", +"\6                                       ", +"\6 If the CPN is red, the program is     ", +"\6 searching for that page. If it's      ", +"\6 green, it's the PN of the currently   ", +"\6 displayed page.                       ", +"\24 pppppppppppppppppppppppppppppppppppp ", +"                                         ", +"                                         ", +"\4\35\7Back 904     Index 900     Next 906 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt906.out b/util/alevt/vt906.out new file mode 100644 index 0000000..156b481 --- /dev/null +++ b/util/alevt/vt906.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System       ", +"  \22`p0`0    p `0pppp                   ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!            ", +#else +HELP_HEADER +#endif +"                                         ", +"\6\15Status Line:           \14\5\30     ", +"\6\15Status Line:           \14\5\30     ", +"\24 #################################### ", +"\6 An\2H\6behind the CPN indicates that  ", +"\6 the page is on hold. This inhibits    ", +"\6 subpage cycling and page updates. A   ", +"\6 click on the CPN toggles the\2H\6flag.", +"                                         ", +"\6 A\5*\6indicates that the page         ", +"\6 contains concealed text. Clicking on  ", +"\6 the\5*\6reveals that text.            ", +"                                         ", +"\6 A CPN in the form\2Sxx\6is shown if a ", +"\6 specific subpage is selected.         ", +"\24 pppppppppppppppppppppppppppppppppppp ", +"                                         ", +"                                         ", +"\4\35\7Back 905     Index 900     Next 907 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt907.out b/util/alevt/vt907.out new file mode 100644 index 0000000..6aeb4e6 --- /dev/null +++ b/util/alevt/vt907.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System        ", +"  \22`p0`0    p `0pppp                    ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!             ", +#else +HELP_HEADER +#endif +"                                          ", +"\6\15Selecting Pages:                     ", +"\6\15Selecting Pages:                     ", +"\24 ####################################  ", +"\6 To select a specific page, you may     ", +"\6 either enter the page number with      ", +"\6 the keyboard or click with the\7left   ", +"\6 mouse button on a page number          ", +"\6 somewhere on the screen.               ", +"\6                                        ", +"\6 Clicking with the\7middle\6button will ", +"\6 show the page in a child window. If    ", +"\6 there is no child window, a new one    ", +"\6 will be opened.                        ", +"\6                                        ", +"\24 pppppppppppppppppppppppppppppppppppp  ", +"                                          ", +"                                          ", +"\4\35\7Back 906     Index 900     Next 908 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt908.out b/util/alevt/vt908.out new file mode 100644 index 0000000..851a9b5 --- /dev/null +++ b/util/alevt/vt908.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System        ", +"  \22`p0`0    p `0pppp                    ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!             ", +#else +HELP_HEADER +#endif +"                                          ", +"\6\15Selecting Pages:                     ", +"\6\15Selecting Pages:                     ", +"\24 ####################################  ", +"\6 AleVT also recognizes something like   ", +"\3 3/7\6as a valid page number. Clicking  ", +"\6 with the\7left\6button will cycle to   ", +"\6 the next subpage of the current page.  ", +"\6 The\7middle\6buttons cycles backwards. ", +"\6                                        ", +"\6 For each window a history of           ", +"\6 recently visited pages is kept.        ", +"\6 Pressing the\7right\6mouse button will ", +"\6 take you back to the previous page.    ", +"\6                                        ", +"\24 pppppppppppppppppppppppppppppppppppp  ", +"                                          ", +"                                          ", +"\4\35\7Back 907     Index 900     Next 909 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt909.out b/util/alevt/vt909.out new file mode 100644 index 0000000..0b28450 --- /dev/null +++ b/util/alevt/vt909.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System       ", +"  \22`p0`0    p `0pppp                   ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!            ", +#else +HELP_HEADER +#endif +"                                         ", +"\6\15FastText Menu:                      ", +"\6\15FastText Menu:                      ", +"\24 #################################### ", +"\6 The last line of each window shows    ", +"\6 the FastText Menu (only if one is     ", +"\6 transmitted for that page).           ", +"\6                                       ", +"\6 It consists of up to four colored     ", +"\6 labels. You may click on a label      ", +"\6 or press one of the function keys     ", +"\6 F1-F4 to go to the associated page.   ", +"\6                                       ", +"\6 For the 5th (white) key present on    ", +"\6 some remote controls press F5.        ", +"\24 pppppppppppppppppppppppppppppppppppp ", +"                                         ", +"                                         ", +"\4\35\7Back 908     Index 900     Next 910 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt910.out b/util/alevt/vt910.out new file mode 100644 index 0000000..d3a2095 --- /dev/null +++ b/util/alevt/vt910.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System       ", +"  \22`p0`0    p `0pppp                   ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!            ", +#else +HELP_HEADER +#endif +"                                         ", +"\6\15Keyboard Commands:                  ", +"\6\15Keyboard Commands:                  ", +"\24 #################################### ", +"  0\6-\0079    \6Enter page number       ", +"  q\6or\7ESC \6Close window              ", +"  h        \6Goto page 900 (help page)   ", +"  i        \6Goto page 100 (index page)  ", +"  o        \6Open a new window           ", +"  SPACE    \6Hold page                   ", +"  RIGHT    \6Goto next page              ", +"  LEFT     \6Goto previous page          ", +"  DOWN     \6Goto next subpage           ", +"  UP       \6Goto previous subpage       ", +"  BACKSPACE\6Previous page from history  ", +"\24 pppppppppppppppppppppppppppppppppppp ", +"                                         ", +"                                         ", +"\4\35\7Back 909     Index 900     Next 911 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt911.out b/util/alevt/vt911.out new file mode 100644 index 0000000..49e6cc1 --- /dev/null +++ b/util/alevt/vt911.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System        ", +"  \22`p0`0    p `0pppp                    ", +"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5        \007 1.7.0   \34", +"  \22# #\42!\42#   \42   \42!             ", +#else +HELP_HEADER +#endif +"                                          ", +"\6\15Keyboard Commands:                   ", +"\6\15Keyboard Commands:                   ", +"\24 ####################################  ", +"  s        \6Save page to file            ", +"  c        \6Clear page cache             ", +"  r        \6Reveal concealed text        ", +"  F1\6-\7F5  \6FastText keys              ", +"  /\6and\7?  \6Search forward/backward    ", +"  n\6and\7N  \6Search next/previous       ", +"  f\6and\7F  \6Fine tune the decoder      ", +"  e        \6Error reduction on/off       ", +"  b        \6Error bell on/off            ", +"\6 Holding the\7shift\6key while pressing ", +"\6 one of the\7cursor\6keys allows        ", +"\6 selecting the 'hex' pages (Ex.: 1f1).  ", +"\24 pppppppppppppppppppppppppppppppppppp  ", +"                                          ", +"\4\35\7Back 910     Index 900     Next 912 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt912.out b/util/alevt/vt912.out new file mode 100644 index 0000000..6fd7d12 --- /dev/null +++ b/util/alevt/vt912.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System         ", +"  \22`p0`0    p `0pppp                     ", +"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5        \7     1.7.0 \34", +"  \22# #\42!\42#   \42   \42!              ", +#else +HELP_HEADER +#endif +"                                           ", +"\6\15Starting alevt-cap:                   ", +"\6\15Starting alevt-cap:                   ", +"\24 ####################################   ", +"\6 $\7alevt-cap\6[options]   Default:      ", +"                                           ", +"   -cs -charset          \6latin-1         ", +"   \6<latin-1/2/koi8-r/                    ", +"   \6iso8859-7>                            ", +"   -f -format            \6ascii           ", +"   \6<fmt,options>                         ", +"   -f help -format help                    ", +"   -h -help                                ", +"   -n -name \6<filename>   ttext-%s.%e     ", +"                                           ", +"\24 pppppppppppppppppppppppppppppppppppp   ", +"                                           ", +"                                           ", +"\4\35\7Back 911     Index 900     Next 913 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt913.out b/util/alevt/vt913.out new file mode 100644 index 0000000..e0f4878 --- /dev/null +++ b/util/alevt/vt913.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System         ", +"  \22`p0`0    p `0pppp                     ", +"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5        \7     1.7.0 \34", +"  \22# #\42!\42#   \42   \42!              ", +#else +HELP_HEADER +#endif +"                                           ", +"\6\15Starting alevt-cap:                   ", +"\6\15Starting alevt-cap:                   ", +"\24 ####################################   ", +"\6 $\7alevt-cap\6[options] Default:        ", +"                                           ", +"    -s -sid\6<sid>       (none;dvb only)   ", +"    -t -ttpid\6<ttpid>   (none;dvb only)   ", +"    -to -timeout\6<secs> (none)            ", +"    -v -vbi\6<vbidev>    /dev/vbi          ", +"                       \6/dev/vbi0         ", +"                       \6/dev/video0       ", +"          \6/dev/dvb/adapter0/demux0       ", +"                                           ", +"                                           ", +"\24 pppppppppppppppppppppppppppppppppppp   ", +"                                           ", +"                                           ", +"\4\35\7Back 912     Index 900     Next 914 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt914.out b/util/alevt/vt914.out new file mode 100644 index 0000000..a55eed1 --- /dev/null +++ b/util/alevt/vt914.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System         ", +"  \22`p0`0    p `0pppp                     ", +"\4\35\22\177 \177j5`p  \177 j5 j5        \7   Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5        \7     1.7.0 \34", +"  \22# #\42!\42#   \42   \42!              ", +#else +HELP_HEADER +#endif +"                                           ", +"\6\15Starting alevt-date:                  ", +"\6\15Starting alevt-date:                  ", +"\24 ####################################   ", +"\6 $\7alevt-date\6[options]  Default:      ", +"                                           ", +"    -d -delta\6<max_secs>  7200 (2 hours)  ", +"    -f -format\6<fmtstr>   %c              ", +"    -h -help                               ", +"    -s -set              \6off             ", +"    -to -timeout\6<seconds>(none)          ", +"    -v -vbi\6<vbidev>      /dev/vbi        ", +"                         \6/dev/vbi0       ", +"                         \6/dev/video0     ", +"            \6/dev/dvb/adapter0/demux0     ", +"\24 pppppppppppppppppppppppppppppppppppp   ", +"                                           ", +"                                           ", +"\4\35\7Back 913     Index 900     Next 915 \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vt915.out b/util/alevt/vt915.out new file mode 100644 index 0000000..66041ac --- /dev/null +++ b/util/alevt/vt915.out @@ -0,0 +1,29 @@ +#ifndef HELP_HEADER +"        \6AleVT Online Help System       ", +"  \22`p0`0    p `0pppp                   ", +"\4\35\22\177 \177j5`p  \177 j5 j5           \7Version \34", +"\4\35\22\177,\177j5\177.! +t>! j5           \7  1.7.0 \34", +"  \22# #\42!\42#   \42   \42!            ", +#else +HELP_HEADER +#endif +"                                         ", +"\6\15QuickClick:                         ", +"\6\15QuickClick:                         ", +"\24 #################################### ", +"\6   100 200 300 400 500 600 700 800     ", +"\6   101 201 301 401 501 601 701 801     ", +"\6   110 210 310 410 510 610 710 810     ", +"\6   120\006220 320 420 520 620 720 820  ", +"\6   130 230 330 430 530 630 730 830     ", +"\6   140\006240 340 440 540 640 740 840  ", +"\6   150 250 350 450 550 650 750 850     ", +"\6   160\006260 360 460 560 660 760 860  ", +"\6   170 270 370 470 570 670 770 870     ", +"\6   180\006280 380 480 580 680 780 880  ", +"\6   190 290 390 490 590 690 790 890     ", +"\24 pppppppppppppppppppppppppppppppppppp ", +"                                         ", +"                                         ", +"\4\35\7             Index 900              \34", +"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", diff --git a/util/alevt/vtxt-iso8859-7.bdf b/util/alevt/vtxt-iso8859-7.bdf new file mode 100644 index 0000000..7d62c95 --- /dev/null +++ b/util/alevt/vtxt-iso8859-7.bdf @@ -0,0 +1,5768 @@ +STARTFONT 2.1 +FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1 +SIZE 1 75 75 +FONTBOUNDINGBOX 9 16 0 -4 +STARTPROPERTIES 10 +POINT_SIZE 1 +PIXEL_SIZE 16 +RESOLUTION_X 75 +RESOLUTION_Y 75 +FONT_ASCENT 12 +FONT_DESCENT 4 +AVERAGE_WIDTH 90 +SPACING "C" +_XMBDFED_INFO "Edited with xmbdfed 4.5." +FONT "vtxt" +ENDPROPERTIES +CHARS 250 +STARTCHAR char0 +ENCODING 0 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 1 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 2 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 3 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 4 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 5 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 6 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 7 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 8 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 9 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 10 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 11 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 12 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 13 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 14 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 15 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 16 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 17 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 18 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 19 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 20 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 21 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 22 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 23 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 24 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 25 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 26 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 27 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 28 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 29 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 30 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 31 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +0000 +0000 +ENDCHAR +STARTCHAR char32 +ENCODING 32 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char33 +ENCODING 33 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3C00 +3C00 +3C00 +1800 +1800 +1800 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char34 +ENCODING 34 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6600 +6600 +6600 +2400 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char35 +ENCODING 35 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3600 +3600 +7F00 +3600 +3600 +3600 +7F00 +3600 +3600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char36 +ENCODING 36 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0C00 +3E00 +6300 +6100 +6000 +3E00 +0300 +0300 +4300 +6300 +3E00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR char37 +ENCODING 37 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +6100 +6300 +0600 +0C00 +1800 +3000 +6300 +4300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char38 +ENCODING 38 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +3600 +1C00 +3B00 +6E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char39 +ENCODING 39 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +3000 +3000 +6000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char40 +ENCODING 40 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0C00 +1800 +3000 +3000 +3000 +3000 +3000 +3000 +1800 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char41 +ENCODING 41 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3000 +1800 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +1800 +3000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char42 +ENCODING 42 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6600 +3C00 +FF00 +3C00 +6600 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char43 +ENCODING 43 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +1800 +1800 +7E00 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char44 +ENCODING 44 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +1800 +3000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char45 +ENCODING 45 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7F00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char46 +ENCODING 46 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char47 +ENCODING 47 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0100 +0300 +0600 +0C00 +1800 +3000 +6000 +4000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char48 +ENCODING 48 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +6600 +C300 +C300 +DB00 +DB00 +C300 +C300 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char49 +ENCODING 49 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3800 +7800 +1800 +1800 +1800 +1800 +1800 +1800 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char50 +ENCODING 50 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +0300 +0600 +0C00 +1800 +3000 +6000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char51 +ENCODING 51 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +0300 +0300 +1E00 +0300 +0300 +0300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char52 +ENCODING 52 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0E00 +1E00 +3600 +6600 +7F00 +0600 +0600 +0600 +0F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char53 +ENCODING 53 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +6000 +6000 +6000 +7E00 +0300 +0300 +0300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char54 +ENCODING 54 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3000 +6000 +6000 +7E00 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char55 +ENCODING 55 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +6300 +0300 +0300 +0600 +0C00 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char56 +ENCODING 56 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +3E00 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char57 +ENCODING 57 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +3F00 +0300 +0300 +0300 +0600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char58 +ENCODING 58 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char59 +ENCODING 59 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +1800 +1800 +1800 +3000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char60 +ENCODING 60 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0600 +0C00 +1800 +3000 +6000 +3000 +1800 +0C00 +0600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char61 +ENCODING 61 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7E00 +0000 +0000 +7E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char62 +ENCODING 62 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +6000 +3000 +1800 +0C00 +0600 +0C00 +1800 +3000 +6000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char63 +ENCODING 63 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +0600 +0C00 +0C00 +0C00 +0000 +0C00 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char64 +ENCODING 64 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3E00 +6300 +6300 +6F00 +6F00 +6F00 +6E00 +6000 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char65 +ENCODING 65 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char66 +ENCODING 66 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3300 +3300 +3300 +3300 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char67 +ENCODING 67 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6000 +6000 +6100 +3300 +1E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char68 +ENCODING 68 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7C00 +3600 +3300 +3300 +3300 +3300 +3300 +3300 +3600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char69 +ENCODING 69 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char70 +ENCODING 70 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char71 +ENCODING 71 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6F00 +6300 +6300 +3300 +1D00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char72 +ENCODING 72 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +6300 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char73 +ENCODING 73 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char74 +ENCODING 74 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0F00 +0600 +0600 +0600 +0600 +0600 +6600 +6600 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char75 +ENCODING 75 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7300 +3300 +3300 +3600 +3C00 +3C00 +3600 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char76 +ENCODING 76 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7800 +3000 +3000 +3000 +3000 +3000 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char77 +ENCODING 77 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +E700 +FF00 +FF00 +DB00 +C300 +C300 +C300 +C300 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char78 +ENCODING 78 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +7300 +7B00 +7F00 +6F00 +6700 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char79 +ENCODING 79 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char80 +ENCODING 80 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char81 +ENCODING 81 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6B00 +6F00 +3E00 +0600 +0700 +0000 +0000 +ENDCHAR +STARTCHAR char82 +ENCODING 82 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3600 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char83 +ENCODING 83 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +3000 +1C00 +0600 +0300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char84 +ENCODING 84 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +DB00 +9900 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char85 +ENCODING 85 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char86 +ENCODING 86 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +C300 +C300 +C300 +C300 +6600 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char87 +ENCODING 87 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +C300 +C300 +DB00 +DB00 +FF00 +6600 +6600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char88 +ENCODING 88 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +6600 +3C00 +1800 +1800 +3C00 +6600 +C300 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char89 +ENCODING 89 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +6600 +3C00 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char90 +ENCODING 90 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +C300 +8600 +0C00 +1800 +3000 +6000 +C100 +C300 +FF00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char91 +ENCODING 91 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char92 +ENCODING 92 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +4000 +6000 +7000 +3800 +1C00 +0E00 +0700 +0300 +0100 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char93 +ENCODING 93 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char94 +ENCODING 94 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0800 +1C00 +3600 +6300 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char95 +ENCODING 95 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char96 +ENCODING 96 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3000 +3000 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char97 +ENCODING 97 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char98 +ENCODING 98 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3C00 +3600 +3300 +3300 +3300 +3300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char99 +ENCODING 99 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6000 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char100 +ENCODING 100 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +0600 +0600 +1E00 +3600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char101 +ENCODING 101 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char102 +ENCODING 102 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +3200 +3000 +7800 +3000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char103 +ENCODING 103 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B00 +6600 +6600 +6600 +6600 +6600 +3E00 +0600 +6600 +3C00 +0000 +ENDCHAR +STARTCHAR char104 +ENCODING 104 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3600 +3B00 +3300 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char105 +ENCODING 105 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char106 +ENCODING 106 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0600 +0000 +0E00 +0600 +0600 +0600 +0600 +0600 +0600 +6600 +6600 +3C00 +0000 +ENDCHAR +STARTCHAR char107 +ENCODING 107 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3300 +3600 +3C00 +3C00 +3600 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char108 +ENCODING 108 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char109 +ENCODING 109 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +E600 +FF00 +DB00 +DB00 +DB00 +DB00 +DB00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char110 +ENCODING 110 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char111 +ENCODING 111 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char112 +ENCODING 112 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3E00 +3000 +3000 +3000 +0000 +ENDCHAR +STARTCHAR char113 +ENCODING 113 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B00 +6600 +6600 +6600 +6600 +6600 +3E00 +0600 +0600 +0600 +0000 +ENDCHAR +STARTCHAR char114 +ENCODING 114 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3B00 +3300 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char115 +ENCODING 115 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +3000 +1C00 +0600 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char116 +ENCODING 116 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1800 +1800 +7E00 +1800 +1800 +1800 +1800 +1B00 +0E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char117 +ENCODING 117 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char118 +ENCODING 118 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +C300 +C300 +C300 +6600 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char119 +ENCODING 119 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +C300 +C300 +DB00 +DB00 +FF00 +6600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char120 +ENCODING 120 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +6600 +3C00 +1800 +3C00 +6600 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char121 +ENCODING 121 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +3F00 +0300 +0600 +0C00 +0000 +ENDCHAR +STARTCHAR char122 +ENCODING 122 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7F00 +6600 +0C00 +1800 +3000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char123 +ENCODING 123 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +1800 +1800 +1800 +7000 +1800 +1800 +1800 +1800 +0E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char124 +ENCODING 124 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char125 +ENCODING 125 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +1800 +1800 +1800 +0E00 +1800 +1800 +1800 +1800 +7000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char126 +ENCODING 126 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3B00 +6E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char127 +ENCODING 127 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 128 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 129 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 130 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 131 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 132 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 133 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 134 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 135 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 136 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 137 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 138 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 139 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 140 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 141 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 142 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 143 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 144 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 145 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 146 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 147 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 148 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 149 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 150 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 151 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 152 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 153 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 154 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 155 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 156 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 157 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 158 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 159 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR U+00A0 NO-BREAK SPACE +ENCODING 160 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+02BD MODIFIER LETTER REVERSED COMMA +ENCODING 161 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1800 +1000 +1000 +0800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+02BC MODIFIER LETTER APOSTROPHE +ENCODING 162 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1800 +0800 +0800 +1000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00A3 POUND SIGN +ENCODING 163 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +1000 +1000 +1000 +7C00 +1000 +1000 +1000 +3E00 +6100 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00A6 BROKEN BAR +ENCODING 166 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +0800 +0800 +0800 +0000 +0000 +0800 +0800 +0800 +0800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00A7 SECTION SIGN +ENCODING 167 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +4200 +4000 +3C00 +4200 +4200 +3C00 +0200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00A8 DIAERESIS +ENCODING 168 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +2400 +2400 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00A9 COPYRIGHT SIGN +ENCODING 169 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +4200 +9900 +A500 +A100 +A100 +A500 +9900 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +ENCODING 171 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +1200 +1200 +2400 +2400 +4800 +2400 +2400 +1200 +1200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00AC NOT SIGN +ENCODING 172 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7E00 +0200 +0200 +0200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00AD SOFT HYPHEN +ENCODING 173 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2015 HORIZONTAL BAR +ENCODING 175 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00B0 DEGREE SIGN +ENCODING 176 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +2800 +2800 +1000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00B1 PLUS-MINUS SIGN +ENCODING 177 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +0800 +0800 +7F00 +0800 +0800 +0800 +0000 +7F00 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00B2 SUPERSCRIPT TWO +ENCODING 178 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1C00 +2200 +0200 +1C00 +2000 +2000 +3E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00B3 SUPERSCRIPT THREE +ENCODING 179 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1C00 +2200 +0200 +1C00 +0200 +2200 +1C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0384 GREEK TONOS +ENCODING 180 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +1000 +1000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0385 GREEK DIALYTIKA TONOS +ENCODING 181 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +1000 +1000 +4400 +4400 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS +ENCODING 182 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +4000 +4000 +0000 +1800 +2400 +2400 +4200 +4200 +7E00 +4200 +4200 +4200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00B7 MIDDLE DOT +ENCODING 183 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS +ENCODING 184 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +4000 +4000 +0000 +7E00 +4000 +4000 +4000 +7C00 +4000 +4000 +4000 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0389 GREEK CAPITAL LETTER ETA WITH TONOS +ENCODING 185 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +4000 +4000 +0000 +4200 +4200 +4200 +4200 +7E00 +4200 +4200 +4200 +4200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+038A GREEK CAPITAL LETTER IOTA WITH TONOS +ENCODING 186 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +4000 +4000 +0000 +3E00 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +ENCODING 187 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +4800 +4800 +2400 +2400 +1200 +2400 +2400 +4800 +4800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS +ENCODING 188 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +4000 +4000 +0000 +3C00 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00BD VULGAR FRACTION ONE HALF +ENCODING 189 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +2200 +6200 +2400 +2800 +2800 +1400 +1A00 +2200 +4400 +4E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS +ENCODING 190 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +4000 +4000 +0000 +4100 +4100 +2200 +2200 +1400 +0800 +0800 +0800 +0800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS +ENCODING 191 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +4000 +4000 +0000 +3E00 +4100 +4100 +4100 +4100 +2200 +1400 +1400 +7700 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +ENCODING 192 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1000 +5400 +4400 +0000 +1000 +1000 +1000 +1000 +1000 +1000 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0391 GREEK CAPITAL LETTER ALPHA +ENCODING 193 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +2400 +2400 +4200 +4200 +7E00 +4200 +4200 +4200 +4200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0392 GREEK CAPITAL LETTER BETA +ENCODING 194 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7C00 +4200 +4200 +4200 +7C00 +4200 +4200 +4200 +4200 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0393 GREEK CAPITAL LETTER GAMMA +ENCODING 195 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0394 GREEK CAPITAL LETTER DELTA +ENCODING 196 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +0800 +1400 +1400 +2200 +2200 +2200 +4100 +4100 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0395 GREEK CAPITAL LETTER EPSILON +ENCODING 197 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +4000 +4000 +4000 +7C00 +4000 +4000 +4000 +4000 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0396 GREEK CAPITAL LETTER ZETA +ENCODING 198 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +0200 +0200 +0400 +0800 +1000 +2000 +4000 +4000 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0397 GREEK CAPITAL LETTER ETA +ENCODING 199 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +4200 +4200 +4200 +4200 +7E00 +4200 +4200 +4200 +4200 +4200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0398 GREEK CAPITAL LETTER THETA +ENCODING 200 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +4200 +4200 +4200 +7E00 +4200 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0399 GREEK CAPITAL LETTER IOTA +ENCODING 201 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+039A GREEK CAPITAL LETTER KAPPA +ENCODING 202 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +4200 +4400 +4800 +5000 +6000 +6000 +5000 +4800 +4400 +4200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+039B GREEK CAPITAL LETTER LAMDA +ENCODING 203 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +0800 +1400 +1400 +2200 +2200 +2200 +4100 +4100 +4100 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+039C GREEK CAPITAL LETTER MU +ENCODING 204 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +4200 +4200 +6600 +6600 +5A00 +5A00 +4200 +4200 +4200 +4200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+039D GREEK CAPITAL LETTER NU +ENCODING 205 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +4200 +6200 +6200 +5200 +5200 +4A00 +4A00 +4600 +4600 +4200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+039E GREEK CAPITAL LETTER XI +ENCODING 206 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +0000 +0000 +0000 +3C00 +0000 +0000 +0000 +0000 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+039F GREEK CAPITAL LETTER OMICRON +ENCODING 207 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03A0 GREEK CAPITAL LETTER PI +ENCODING 208 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +2200 +2200 +2200 +2200 +2200 +2200 +2200 +2200 +2200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03A1 GREEK CAPITAL LETTER RHO +ENCODING 209 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7C00 +4200 +4200 +4200 +7C00 +4000 +4000 +4000 +4000 +4000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03A3 GREEK CAPITAL LETTER SIGMA +ENCODING 211 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +4000 +2000 +1000 +0800 +0800 +1000 +2000 +4000 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03A4 GREEK CAPITAL LETTER TAU +ENCODING 212 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03A5 GREEK CAPITAL LETTER UPSILON +ENCODING 213 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +4100 +4100 +2200 +2200 +1400 +0800 +0800 +0800 +0800 +0800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03A6 GREEK CAPITAL LETTER PHI +ENCODING 214 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +0800 +3E00 +4900 +4900 +4900 +4900 +3E00 +0800 +1C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03A7 GREEK CAPITAL LETTER CHI +ENCODING 215 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +4200 +4200 +2400 +2400 +1800 +1800 +2400 +2400 +4200 +4200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03A8 GREEK CAPITAL LETTER PSI +ENCODING 216 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +4900 +4900 +4900 +4900 +4900 +3E00 +0800 +0800 +0800 +0800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03A9 GREEK CAPITAL LETTER OMEGA +ENCODING 217 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +4100 +4100 +4100 +4100 +4100 +2200 +1400 +1400 +7700 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +ENCODING 218 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +2400 +2400 +0000 +3E00 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +ENCODING 219 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +2400 +2400 +0000 +4100 +4100 +2200 +2200 +1400 +0800 +0800 +0800 +0800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03AC GREEK SMALL LETTER ALPHA WITH TONOS +ENCODING 220 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3200 +4A00 +4400 +4400 +4400 +4400 +4A00 +3200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03AD GREEK SMALL LETTER EPSILON WITH TONOS +ENCODING 221 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3E00 +4000 +4000 +3C00 +4000 +4000 +4000 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03AE GREEK SMALL LETTER ETA WITH TONOS +ENCODING 222 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +1000 +0000 +0000 +5C00 +6200 +4200 +4200 +4200 +4200 +4200 +4200 +0200 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03AF GREEK SMALL LETTER IOTA WITH TONOS +ENCODING 223 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +1000 +0000 +0000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +ENCODING 224 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +1000 +4400 +4400 +0000 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03B1 GREEK SMALL LETTER ALPHA +ENCODING 225 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +3200 +4A00 +4400 +4400 +4400 +4400 +4A00 +3200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03B2 GREEK SMALL LETTER BETA +ENCODING 226 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3800 +4400 +4400 +4400 +7C00 +4200 +4200 +4200 +6200 +5C00 +4000 +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+03B3 GREEK SMALL LETTER GAMMA +ENCODING 227 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +3100 +4900 +0A00 +0400 +0800 +0800 +1000 +1000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03B4 GREEK SMALL LETTER DELTA +ENCODING 228 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +2000 +2000 +2000 +1800 +2400 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03B5 GREEK SMALL LETTER EPSILON +ENCODING 229 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +3C00 +4200 +4000 +3C00 +4000 +4000 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03B6 GREEK SMALL LETTER ZETA +ENCODING 230 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +2000 +2000 +1C00 +0800 +1000 +2000 +2000 +2000 +2000 +1C00 +0200 +1C00 +0000 +0000 +ENDCHAR +STARTCHAR U+03B7 GREEK SMALL LETTER ETA +ENCODING 231 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +5C00 +6200 +4200 +4200 +4200 +4200 +4200 +4200 +0200 +0200 +0000 +0000 +ENDCHAR +STARTCHAR U+03B8 GREEK SMALL LETTER THETA +ENCODING 232 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +2400 +2400 +4200 +7E00 +4200 +4200 +2400 +2400 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03B9 GREEK SMALL LETTER IOTA +ENCODING 233 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03BA GREEK SMALL LETTER KAPPA +ENCODING 234 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +2200 +2400 +2800 +3000 +3000 +2800 +2400 +2200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03BB GREEK SMALL LETTER LAMDA +ENCODING 235 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +2000 +2000 +1000 +1000 +0800 +1800 +2400 +2400 +4200 +4200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03BC GREEK SMALL LETTER MU +ENCODING 236 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +4200 +4200 +4200 +4200 +6600 +6600 +5A00 +4200 +4000 +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+03BD GREEK SMALL LETTER NU +ENCODING 237 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +4200 +4200 +4200 +4400 +4400 +4800 +5000 +6000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03BE GREEK SMALL LETTER XI +ENCODING 238 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +4000 +4000 +3C00 +4000 +4000 +3C00 +4000 +4000 +3C00 +0200 +0200 +3C00 +0000 +0000 +ENDCHAR +STARTCHAR U+03BF GREEK SMALL LETTER OMICRON +ENCODING 239 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +3C00 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03C0 GREEK SMALL LETTER PI +ENCODING 240 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +7E00 +2400 +2400 +2400 +2400 +2400 +2400 +2400 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03C1 GREEK SMALL LETTER RHO +ENCODING 241 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +3C00 +4200 +4200 +4200 +4200 +4200 +6200 +5C00 +4000 +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+03C2 GREEK SMALL LETTER FINAL SIGMA +ENCODING 242 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1E00 +2000 +4000 +4000 +4000 +2000 +1C00 +0200 +0200 +1C00 +0000 +0000 +ENDCHAR +STARTCHAR U+03C3 GREEK SMALL LETTER SIGMA +ENCODING 243 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +3F00 +4800 +4400 +4400 +4400 +4400 +4400 +3800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03C4 GREEK SMALL LETTER TAU +ENCODING 244 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +7E00 +1000 +1000 +1000 +1000 +1000 +1000 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03C5 GREEK SMALL LETTER UPSILON +ENCODING 245 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03C6 GREEK SMALL LETTER PHI +ENCODING 246 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +3E00 +4900 +4900 +4900 +4900 +4900 +4900 +3E00 +0800 +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+03C7 GREEK SMALL LETTER CHI +ENCODING 247 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +4200 +4200 +2400 +2400 +1800 +1800 +2400 +2400 +4200 +4200 +0000 +0000 +ENDCHAR +STARTCHAR U+03C8 GREEK SMALL LETTER PSI +ENCODING 248 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +4900 +4900 +4900 +4900 +4900 +3E00 +0800 +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+03C9 GREEK SMALL LETTER OMEGA +ENCODING 249 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +2200 +4100 +4100 +4900 +4900 +4900 +4900 +3600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA +ENCODING 250 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +2400 +2400 +0000 +0000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA +ENCODING 251 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +2400 +2400 +0000 +0000 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03CC GREEK SMALL LETTER OMICRON WITH TONOS +ENCODING 252 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3C00 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03CD GREEK SMALL LETTER UPSILON WITH TONOS +ENCODING 253 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1000 +1000 +0000 +0000 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+03CE GREEK SMALL LETTER OMEGA WITH TONOS +ENCODING 254 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0800 +0800 +0000 +0000 +2200 +4100 +4100 +4900 +4900 +4900 +4900 +3600 +0000 +0000 +0000 +0000 +ENDCHAR +ENDFONT diff --git a/util/alevt/vtxt-koi8.bdf b/util/alevt/vtxt-koi8.bdf new file mode 100644 index 0000000..a7398b2 --- /dev/null +++ b/util/alevt/vtxt-koi8.bdf @@ -0,0 +1,5906 @@ +STARTFONT 2.1 +FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1 +SIZE 1 75 75 +FONTBOUNDINGBOX 9 16 0 -4 +STARTPROPERTIES 10 +POINT_SIZE 1 +PIXEL_SIZE 16 +RESOLUTION_X 75 +RESOLUTION_Y 75 +FONT_ASCENT 12 +FONT_DESCENT 4 +AVERAGE_WIDTH 90 +SPACING "C" +_XMBDFED_INFO "Edited with xmbdfed 3.0." +FONT "vtxt" +ENDPROPERTIES +CHARS 256 +STARTCHAR char0 +ENCODING 0 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 1 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 2 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 3 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 4 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 5 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 6 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 7 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 8 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 9 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 10 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 11 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 12 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 13 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 14 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 15 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 16 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 17 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 18 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 19 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char0 +ENCODING 20 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 21 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 22 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 23 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char0 +ENCODING 24 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 25 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 26 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 27 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char0 +ENCODING 28 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 29 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 30 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 31 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char32 +ENCODING 32 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char33 +ENCODING 33 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3C00 +3C00 +3C00 +1800 +1800 +1800 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char34 +ENCODING 34 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6600 +6600 +6600 +2400 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char35 +ENCODING 35 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3600 +3600 +7F00 +3600 +3600 +3600 +7F00 +3600 +3600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char36 +ENCODING 36 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0C00 +3E00 +6300 +6100 +6000 +3E00 +0300 +0300 +4300 +6300 +3E00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR char37 +ENCODING 37 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +6100 +6300 +0600 +0C00 +1800 +3000 +6300 +4300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char38 +ENCODING 38 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +3600 +1C00 +3B00 +6E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char39 +ENCODING 39 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +3000 +3000 +6000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char40 +ENCODING 40 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0C00 +1800 +3000 +3000 +3000 +3000 +3000 +3000 +1800 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char41 +ENCODING 41 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3000 +1800 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +1800 +3000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char42 +ENCODING 42 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6600 +3C00 +FF00 +3C00 +6600 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char43 +ENCODING 43 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +1800 +1800 +7E00 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char44 +ENCODING 44 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +1800 +3000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char45 +ENCODING 45 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7F00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char46 +ENCODING 46 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char47 +ENCODING 47 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0100 +0300 +0600 +0C00 +1800 +3000 +6000 +4000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char48 +ENCODING 48 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +6600 +C300 +C300 +DB00 +DB00 +C300 +C300 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char49 +ENCODING 49 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3800 +7800 +1800 +1800 +1800 +1800 +1800 +1800 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char50 +ENCODING 50 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +0300 +0600 +0C00 +1800 +3000 +6000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char51 +ENCODING 51 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +0300 +0300 +1E00 +0300 +0300 +0300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char52 +ENCODING 52 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0E00 +1E00 +3600 +6600 +7F00 +0600 +0600 +0600 +0F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char53 +ENCODING 53 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +6000 +6000 +6000 +7E00 +0300 +0300 +0300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char54 +ENCODING 54 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3000 +6000 +6000 +7E00 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char55 +ENCODING 55 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +6300 +0300 +0300 +0600 +0C00 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char56 +ENCODING 56 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +3E00 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char57 +ENCODING 57 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +3F00 +0300 +0300 +0300 +0600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char58 +ENCODING 58 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char59 +ENCODING 59 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +1800 +1800 +1800 +3000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char60 +ENCODING 60 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0600 +0C00 +1800 +3000 +6000 +3000 +1800 +0C00 +0600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char61 +ENCODING 61 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7E00 +0000 +0000 +7E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char62 +ENCODING 62 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +6000 +3000 +1800 +0C00 +0600 +0C00 +1800 +3000 +6000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char63 +ENCODING 63 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +0600 +0C00 +0C00 +0C00 +0000 +0C00 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char64 +ENCODING 64 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3E00 +6300 +6300 +6F00 +6F00 +6F00 +6E00 +6000 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char65 +ENCODING 65 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char66 +ENCODING 66 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3300 +3300 +3300 +3300 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char67 +ENCODING 67 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6000 +6000 +6100 +3300 +1E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char68 +ENCODING 68 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7C00 +3600 +3300 +3300 +3300 +3300 +3300 +3300 +3600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char69 +ENCODING 69 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char70 +ENCODING 70 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char71 +ENCODING 71 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6F00 +6300 +6300 +3300 +1D00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char72 +ENCODING 72 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +6300 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char73 +ENCODING 73 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char74 +ENCODING 74 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0F00 +0600 +0600 +0600 +0600 +0600 +6600 +6600 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char75 +ENCODING 75 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7300 +3300 +3300 +3600 +3C00 +3C00 +3600 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char76 +ENCODING 76 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7800 +3000 +3000 +3000 +3000 +3000 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char77 +ENCODING 77 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +E700 +FF00 +FF00 +DB00 +C300 +C300 +C300 +C300 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char78 +ENCODING 78 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +7300 +7B00 +7F00 +6F00 +6700 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char79 +ENCODING 79 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char80 +ENCODING 80 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char81 +ENCODING 81 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6B00 +6F00 +3E00 +0600 +0700 +0000 +0000 +ENDCHAR +STARTCHAR char82 +ENCODING 82 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3600 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char83 +ENCODING 83 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +3000 +1C00 +0600 +0300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char84 +ENCODING 84 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +DB00 +9900 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char85 +ENCODING 85 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char86 +ENCODING 86 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +C300 +C300 +C300 +C300 +6600 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char87 +ENCODING 87 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +C300 +C300 +DB00 +DB00 +FF00 +6600 +6600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char88 +ENCODING 88 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +6600 +3C00 +1800 +1800 +3C00 +6600 +C300 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char89 +ENCODING 89 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +6600 +3C00 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char90 +ENCODING 90 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +C300 +8600 +0C00 +1800 +3000 +6000 +C100 +C300 +FF00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char91 +ENCODING 91 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char92 +ENCODING 92 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +4000 +6000 +7000 +3800 +1C00 +0E00 +0700 +0300 +0100 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char93 +ENCODING 93 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char94 +ENCODING 94 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0800 +1C00 +3600 +6300 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char95 +ENCODING 95 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char96 +ENCODING 96 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3000 +3000 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char97 +ENCODING 97 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char98 +ENCODING 98 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3C00 +3600 +3300 +3300 +3300 +3300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char99 +ENCODING 99 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6000 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char100 +ENCODING 100 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +0600 +0600 +1E00 +3600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char101 +ENCODING 101 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char102 +ENCODING 102 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +3200 +3000 +7800 +3000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char103 +ENCODING 103 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B00 +6600 +6600 +6600 +6600 +6600 +3E00 +0600 +6600 +3C00 +0000 +ENDCHAR +STARTCHAR char104 +ENCODING 104 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3600 +3B00 +3300 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char105 +ENCODING 105 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char106 +ENCODING 106 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0600 +0000 +0E00 +0600 +0600 +0600 +0600 +0600 +0600 +6600 +6600 +3C00 +0000 +ENDCHAR +STARTCHAR char107 +ENCODING 107 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3300 +3600 +3C00 +3C00 +3600 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char108 +ENCODING 108 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char109 +ENCODING 109 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +E600 +FF00 +DB00 +DB00 +DB00 +DB00 +DB00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char110 +ENCODING 110 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char111 +ENCODING 111 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char112 +ENCODING 112 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3E00 +3000 +3000 +7800 +0000 +ENDCHAR +STARTCHAR char113 +ENCODING 113 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B00 +6600 +6600 +6600 +6600 +6600 +3E00 +0600 +0600 +0F00 +0000 +ENDCHAR +STARTCHAR char114 +ENCODING 114 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3B00 +3300 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char115 +ENCODING 115 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +3000 +1C00 +0600 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char116 +ENCODING 116 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1800 +1800 +7E00 +1800 +1800 +1800 +1800 +1B00 +0E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char117 +ENCODING 117 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char118 +ENCODING 118 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +C300 +C300 +C300 +6600 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char119 +ENCODING 119 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +C300 +C300 +DB00 +DB00 +FF00 +6600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char120 +ENCODING 120 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +6600 +3C00 +1800 +3C00 +6600 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char121 +ENCODING 121 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +3F00 +0300 +0600 +7C00 +0000 +ENDCHAR +STARTCHAR char122 +ENCODING 122 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7F00 +6600 +0C00 +1800 +3000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char123 +ENCODING 123 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +1800 +1800 +1800 +7000 +1800 +1800 +1800 +1800 +0E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char124 +ENCODING 124 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char125 +ENCODING 125 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +1800 +1800 +1800 +0E00 +1800 +1800 +1800 +1800 +7000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char126 +ENCODING 126 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3B00 +6E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char127 +ENCODING 127 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 128 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 129 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 130 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 131 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 132 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 133 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 134 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 135 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 136 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 137 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 138 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 139 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 140 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 141 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 142 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 143 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 144 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 145 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 146 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 147 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char0 +ENCODING 148 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 149 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 150 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 151 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char0 +ENCODING 152 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 153 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 154 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 155 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char0 +ENCODING 156 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 157 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 158 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 159 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char160 +ENCODING 160 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +0880 +0880 +0880 +0880 +FF80 +0880 +0880 +0880 +0880 +0880 +FF80 +0880 +0880 +0880 +0880 +ENDCHAR +STARTCHAR char161 +ENCODING 161 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +0000 +1800 +1800 +1800 +3C00 +3C00 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char162 +ENCODING 162 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1800 +1800 +7E00 +C300 +C000 +C000 +C000 +C300 +7E00 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char163 +ENCODING 163 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1C00 +3600 +3200 +3000 +7800 +3000 +3000 +3000 +3000 +7300 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char164 +ENCODING 164 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +4100 +6300 +3E00 +6300 +6300 +6300 +6300 +3E00 +6300 +4100 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char165 +ENCODING 165 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +6600 +3C00 +1800 +FF00 +1800 +FF00 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char166 +ENCODING 166 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char167 +ENCODING 167 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3E00 +6300 +3000 +1C00 +3600 +6300 +6300 +3600 +1C00 +0600 +6300 +3E00 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char168 +ENCODING 168 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +7E00 +DB00 +FF00 +BD00 +C300 +E700 +FF00 +7E00 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char169 +ENCODING 169 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +4100 +5D00 +5100 +5100 +5D00 +4100 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char170 +ENCODING 170 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3800 +0C00 +3C00 +6400 +3C00 +0000 +7C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char171 +ENCODING 171 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +1800 +3000 +7F00 +7F00 +3000 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char172 +ENCODING 172 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3C00 +7E00 +5A00 +1800 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char173 +ENCODING 173 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char174 +ENCODING 174 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +4100 +5D00 +5500 +5900 +5500 +4100 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char175 +ENCODING 175 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +7F00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char176 +ENCODING 176 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1C00 +3600 +3600 +1C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char177 +ENCODING 177 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +7E00 +1800 +1800 +0000 +0000 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char178 +ENCODING 178 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3800 +6C00 +1800 +3000 +6400 +7C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char179 +ENCODING 179 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +7C00 +0C00 +1800 +0C00 +6C00 +3800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char180 +ENCODING 180 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1800 +3000 +6000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char181 +ENCODING 181 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +6600 +6600 +6600 +6600 +6600 +7E00 +6300 +6000 +C000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char182 +ENCODING 182 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +DB00 +DB00 +DB00 +7B00 +1B00 +1B00 +1B00 +1B00 +1B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char183 +ENCODING 183 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char184 +ENCODING 184 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0080 +0100 +0300 +0600 +0C00 +1C00 +3000 +7F00 +7700 +0E00 +1C00 +1800 +3000 +6000 +8000 +0000 +ENDCHAR +STARTCHAR char185 +ENCODING 185 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +7000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char186 +ENCODING 186 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3800 +6C00 +4400 +6C00 +3800 +0000 +7C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char187 +ENCODING 187 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0C00 +0600 +7F00 +7F00 +0600 +0C00 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char188 +ENCODING 188 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6000 +6000 +6100 +6300 +6600 +0C00 +1800 +3300 +6700 +4B00 +1F00 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR char189 +ENCODING 189 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6000 +6000 +6100 +6300 +6600 +0C00 +1800 +3000 +6700 +4D80 +0300 +0600 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char190 +ENCODING 190 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +7800 +1800 +3900 +1B00 +7600 +0C00 +1800 +3300 +6700 +4B00 +1F00 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR char191 +ENCODING 191 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +0000 +1800 +1800 +3000 +6000 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char238 +ENCODING 192 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +CE00 +DB00 +DB00 +FB00 +DB00 +DB00 +CE00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char160 +ENCODING 193 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7800 +0C00 +7C00 +CC00 +CC00 +CC00 +7600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char161 +ENCODING 194 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0200 +0600 +3C00 +6000 +6000 +7C00 +6600 +6600 +6600 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char230 +ENCODING 195 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +CC00 +CC00 +CC00 +CC00 +CC00 +CC00 +FE00 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR char164 +ENCODING 196 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +1E00 +3600 +3600 +6600 +6600 +6600 +FF00 +C300 +C300 +0000 +0000 +ENDCHAR +STARTCHAR char165 +ENCODING 197 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7C00 +C600 +FE00 +C000 +C000 +C600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char228 +ENCODING 198 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +3C00 +1800 +7E00 +DB00 +DB00 +DB00 +DB00 +7E00 +1800 +1800 +3C00 +0000 +ENDCHAR +STARTCHAR char163 +ENCODING 199 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7E00 +3200 +3200 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char229 +ENCODING 200 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C600 +6C00 +3800 +3800 +3800 +6C00 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char168 +ENCODING 201 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C600 +C600 +CE00 +D600 +E600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char169 +ENCODING 202 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3800 +3800 +C600 +C600 +CE00 +D600 +E600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char170 +ENCODING 203 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +E600 +6C00 +7800 +7800 +6C00 +6600 +E600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char171 +ENCODING 204 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +1E00 +3600 +6600 +6600 +6600 +6600 +6600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char172 +ENCODING 205 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C600 +EE00 +FE00 +FE00 +D600 +D600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char173 +ENCODING 206 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C600 +C600 +C600 +FE00 +C600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char174 +ENCODING 207 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7C00 +C600 +C600 +C600 +C600 +C600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char175 +ENCODING 208 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FE00 +C600 +C600 +C600 +C600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char239 +ENCODING 209 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7E00 +CC00 +CC00 +FC00 +6C00 +CC00 +CE00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char224 +ENCODING 210 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +DC00 +6600 +6600 +6600 +6600 +6600 +7C00 +6000 +6000 +F000 +0000 +ENDCHAR +STARTCHAR char225 +ENCODING 211 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7C00 +C600 +C000 +C000 +C000 +C600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char226 +ENCODING 212 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7E00 +5A00 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char227 +ENCODING 213 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C600 +C600 +C600 +C600 +C600 +7E00 +0600 +0600 +C600 +7C00 +0000 +ENDCHAR +STARTCHAR char166 +ENCODING 214 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +D600 +D600 +5400 +7C00 +5400 +D600 +D600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char162 +ENCODING 215 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FC00 +6600 +6600 +7C00 +6600 +6600 +FC00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char236 +ENCODING 216 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +6000 +6000 +7C00 +6600 +6600 +FC00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char235 +ENCODING 217 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C600 +C600 +C600 +F600 +DE00 +DE00 +F600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char167 +ENCODING 218 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3C00 +6600 +0600 +0C00 +0600 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char232 +ENCODING 219 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +D600 +D600 +D600 +D600 +D600 +D600 +FE00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char237 +ENCODING 220 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3C00 +6600 +0600 +1E00 +0600 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char233 +ENCODING 221 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +D600 +D600 +D600 +D600 +D600 +D600 +FE00 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR char231 +ENCODING 222 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C600 +C600 +C600 +C600 +7E00 +0600 +0600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char234 +ENCODING 223 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F800 +B000 +3000 +3E00 +3300 +3300 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char158 +ENCODING 224 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +CE00 +DB00 +DB00 +DB00 +FB00 +DB00 +DB00 +DB00 +DB00 +CE00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char128 +ENCODING 225 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3600 +6600 +C600 +C600 +FE00 +C600 +C600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char129 +ENCODING 226 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FE00 +6200 +6200 +6000 +7C00 +6600 +6600 +6600 +6600 +FC00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char150 +ENCODING 227 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +CC00 +CC00 +CC00 +CC00 +CC00 +CC00 +CC00 +CC00 +CC00 +FE00 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR char132 +ENCODING 228 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +FF00 +C300 +8100 +0000 +0000 +ENDCHAR +STARTCHAR char133 +ENCODING 229 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FE00 +6600 +6200 +6800 +7800 +6800 +6000 +6200 +6600 +FE00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char148 +ENCODING 230 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3C00 +1800 +7E00 +DB00 +DB00 +DB00 +DB00 +DB00 +7E00 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char131 +ENCODING 231 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FE00 +6200 +6200 +6000 +6000 +6000 +6000 +6000 +6000 +F000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char149 +ENCODING 232 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C600 +C600 +6C00 +7C00 +3800 +3800 +7C00 +6C00 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char136 +ENCODING 233 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C600 +C600 +CE00 +CE00 +D600 +E600 +E600 +C600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char137 +ENCODING 234 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3800 +3800 +C600 +C600 +CE00 +CE00 +D600 +E600 +E600 +C600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char138 +ENCODING 235 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +E600 +6600 +6C00 +6C00 +7800 +7800 +6C00 +6C00 +6600 +E600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char139 +ENCODING 236 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3600 +6600 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char140 +ENCODING 237 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C600 +EE00 +FE00 +FE00 +D600 +C600 +C600 +C600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char141 +ENCODING 238 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C600 +C600 +C600 +C600 +FE00 +C600 +C600 +C600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char142 +ENCODING 239 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7C00 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char143 +ENCODING 240 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FE00 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char159 +ENCODING 241 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3F00 +6600 +6600 +6600 +3E00 +3E00 +6600 +6600 +6600 +E700 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char144 +ENCODING 242 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FC00 +6600 +6600 +6600 +7C00 +6000 +6000 +6000 +6000 +F000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char145 +ENCODING 243 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +6600 +C200 +C000 +C000 +C000 +C000 +C200 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char146 +ENCODING 244 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +5A00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char147 +ENCODING 245 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C600 +C600 +C600 +C600 +C600 +7E00 +0600 +0600 +C600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char134 +ENCODING 246 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +D600 +D600 +5400 +5400 +7C00 +7C00 +5400 +D600 +D600 +D600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char130 +ENCODING 247 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FC00 +6600 +6600 +6600 +7C00 +6600 +6600 +6600 +6600 +FC00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char156 +ENCODING 248 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +F000 +6000 +6000 +6000 +7C00 +6600 +6600 +6600 +6600 +FC00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char155 +ENCODING 249 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +C300 +F300 +DB00 +DB00 +DB00 +DB00 +F300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char135 +ENCODING 250 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7C00 +C600 +0600 +0600 +3C00 +0600 +0600 +0600 +C600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char152 +ENCODING 251 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +FF00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char157 +ENCODING 252 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7C00 +C600 +0600 +2600 +3E00 +2600 +0600 +0600 +C600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char153 +ENCODING 253 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +FF00 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR char151 +ENCODING 254 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C600 +C600 +C600 +C600 +C600 +7E00 +0600 +0600 +0600 +0600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char154 +ENCODING 255 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +F800 +B000 +3000 +3000 +3C00 +3600 +3600 +3600 +3600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +ENDFONT diff --git a/util/alevt/vtxt-latin-1.bdf b/util/alevt/vtxt-latin-1.bdf new file mode 100644 index 0000000..2f1a11b --- /dev/null +++ b/util/alevt/vtxt-latin-1.bdf @@ -0,0 +1,5906 @@ +STARTFONT 2.1 +FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1 +SIZE 1 75 75 +FONTBOUNDINGBOX 9 16 0 -4 +STARTPROPERTIES 10 +POINT_SIZE 1 +PIXEL_SIZE 16 +RESOLUTION_X 75 +RESOLUTION_Y 75 +FONT_ASCENT 12 +FONT_DESCENT 4 +AVERAGE_WIDTH 90 +SPACING "C" +_XMBDFED_INFO "Edited with xmbdfed 2.4." +FONT "vtxt" +ENDPROPERTIES +CHARS 256 +STARTCHAR char0 +ENCODING 0 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 1 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 2 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 3 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 4 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 5 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 6 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 7 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 8 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 9 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 10 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 11 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 12 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 13 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 14 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 15 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 16 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 17 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 18 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 19 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char0 +ENCODING 20 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 21 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 22 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 23 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char0 +ENCODING 24 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 25 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 26 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 27 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char0 +ENCODING 28 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 29 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 30 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 31 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char32 +ENCODING 32 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char33 +ENCODING 33 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3C00 +3C00 +3C00 +1800 +1800 +1800 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char34 +ENCODING 34 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6600 +6600 +6600 +2400 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char35 +ENCODING 35 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3600 +3600 +7F00 +3600 +3600 +3600 +7F00 +3600 +3600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char36 +ENCODING 36 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0C00 +3E00 +6300 +6100 +6000 +3E00 +0300 +0300 +4300 +6300 +3E00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR char37 +ENCODING 37 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +6100 +6300 +0600 +0C00 +1800 +3000 +6300 +4300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char38 +ENCODING 38 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +3600 +1C00 +3B00 +6E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char39 +ENCODING 39 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +3000 +3000 +6000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char40 +ENCODING 40 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0C00 +1800 +3000 +3000 +3000 +3000 +3000 +3000 +1800 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char41 +ENCODING 41 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3000 +1800 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +1800 +3000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char42 +ENCODING 42 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6600 +3C00 +FF00 +3C00 +6600 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char43 +ENCODING 43 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +1800 +1800 +7E00 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char44 +ENCODING 44 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +1800 +3000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char45 +ENCODING 45 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7F00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char46 +ENCODING 46 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char47 +ENCODING 47 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0100 +0300 +0600 +0C00 +1800 +3000 +6000 +4000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char48 +ENCODING 48 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +6600 +C300 +C300 +DB00 +DB00 +C300 +C300 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char49 +ENCODING 49 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3800 +7800 +1800 +1800 +1800 +1800 +1800 +1800 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char50 +ENCODING 50 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +0300 +0600 +0C00 +1800 +3000 +6000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char51 +ENCODING 51 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +0300 +0300 +1E00 +0300 +0300 +0300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char52 +ENCODING 52 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0E00 +1E00 +3600 +6600 +7F00 +0600 +0600 +0600 +0F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char53 +ENCODING 53 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +6000 +6000 +6000 +7E00 +0300 +0300 +0300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char54 +ENCODING 54 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3000 +6000 +6000 +7E00 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char55 +ENCODING 55 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +6300 +0300 +0300 +0600 +0C00 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char56 +ENCODING 56 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +3E00 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char57 +ENCODING 57 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +3F00 +0300 +0300 +0300 +0600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char58 +ENCODING 58 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char59 +ENCODING 59 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +1800 +1800 +1800 +3000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char60 +ENCODING 60 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0600 +0C00 +1800 +3000 +6000 +3000 +1800 +0C00 +0600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char61 +ENCODING 61 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7E00 +0000 +0000 +7E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char62 +ENCODING 62 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +6000 +3000 +1800 +0C00 +0600 +0C00 +1800 +3000 +6000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char63 +ENCODING 63 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +0600 +0C00 +0C00 +0C00 +0000 +0C00 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char64 +ENCODING 64 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3E00 +6300 +6300 +6F00 +6F00 +6F00 +6E00 +6000 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char65 +ENCODING 65 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char66 +ENCODING 66 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3300 +3300 +3300 +3300 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char67 +ENCODING 67 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6000 +6000 +6100 +3300 +1E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char68 +ENCODING 68 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7C00 +3600 +3300 +3300 +3300 +3300 +3300 +3300 +3600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char69 +ENCODING 69 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char70 +ENCODING 70 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char71 +ENCODING 71 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6F00 +6300 +6300 +3300 +1D00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char72 +ENCODING 72 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +6300 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char73 +ENCODING 73 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char74 +ENCODING 74 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0F00 +0600 +0600 +0600 +0600 +0600 +6600 +6600 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char75 +ENCODING 75 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7300 +3300 +3300 +3600 +3C00 +3C00 +3600 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char76 +ENCODING 76 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7800 +3000 +3000 +3000 +3000 +3000 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char77 +ENCODING 77 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +E700 +FF00 +FF00 +DB00 +C300 +C300 +C300 +C300 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char78 +ENCODING 78 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +7300 +7B00 +7F00 +6F00 +6700 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char79 +ENCODING 79 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char80 +ENCODING 80 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char81 +ENCODING 81 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6B00 +6F00 +3E00 +0600 +0700 +0000 +0000 +ENDCHAR +STARTCHAR char82 +ENCODING 82 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3600 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char83 +ENCODING 83 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +3000 +1C00 +0600 +0300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char84 +ENCODING 84 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +DB00 +9900 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char85 +ENCODING 85 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char86 +ENCODING 86 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +C300 +C300 +C300 +C300 +6600 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char87 +ENCODING 87 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +C300 +C300 +DB00 +DB00 +FF00 +6600 +6600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char88 +ENCODING 88 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +6600 +3C00 +1800 +1800 +3C00 +6600 +C300 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char89 +ENCODING 89 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +6600 +3C00 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char90 +ENCODING 90 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +C300 +8600 +0C00 +1800 +3000 +6000 +C100 +C300 +FF00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char91 +ENCODING 91 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char92 +ENCODING 92 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +4000 +6000 +7000 +3800 +1C00 +0E00 +0700 +0300 +0100 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char93 +ENCODING 93 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char94 +ENCODING 94 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0800 +1C00 +3600 +6300 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char95 +ENCODING 95 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char96 +ENCODING 96 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3000 +3000 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char97 +ENCODING 97 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char98 +ENCODING 98 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3C00 +3600 +3300 +3300 +3300 +3300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char99 +ENCODING 99 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6000 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char100 +ENCODING 100 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +0600 +0600 +1E00 +3600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char101 +ENCODING 101 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char102 +ENCODING 102 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +3200 +3000 +7800 +3000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char103 +ENCODING 103 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B00 +6600 +6600 +6600 +6600 +6600 +3E00 +0600 +6600 +3C00 +0000 +ENDCHAR +STARTCHAR char104 +ENCODING 104 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3600 +3B00 +3300 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char105 +ENCODING 105 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char106 +ENCODING 106 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0600 +0000 +0E00 +0600 +0600 +0600 +0600 +0600 +0600 +6600 +6600 +3C00 +0000 +ENDCHAR +STARTCHAR char107 +ENCODING 107 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3300 +3600 +3C00 +3C00 +3600 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char108 +ENCODING 108 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char109 +ENCODING 109 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +E600 +FF00 +DB00 +DB00 +DB00 +DB00 +DB00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char110 +ENCODING 110 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char111 +ENCODING 111 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char112 +ENCODING 112 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3E00 +3000 +3000 +7800 +0000 +ENDCHAR +STARTCHAR char113 +ENCODING 113 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B00 +6600 +6600 +6600 +6600 +6600 +3E00 +0600 +0600 +0F00 +0000 +ENDCHAR +STARTCHAR char114 +ENCODING 114 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3B00 +3300 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char115 +ENCODING 115 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +3000 +1C00 +0600 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char116 +ENCODING 116 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1800 +1800 +7E00 +1800 +1800 +1800 +1800 +1B00 +0E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char117 +ENCODING 117 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char118 +ENCODING 118 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +C300 +C300 +C300 +6600 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char119 +ENCODING 119 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +C300 +C300 +DB00 +DB00 +FF00 +6600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char120 +ENCODING 120 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +6600 +3C00 +1800 +3C00 +6600 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char121 +ENCODING 121 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +3F00 +0300 +0600 +7C00 +0000 +ENDCHAR +STARTCHAR char122 +ENCODING 122 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7F00 +6600 +0C00 +1800 +3000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char123 +ENCODING 123 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +1800 +1800 +1800 +7000 +1800 +1800 +1800 +1800 +0E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char124 +ENCODING 124 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char125 +ENCODING 125 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +1800 +1800 +1800 +0E00 +1800 +1800 +1800 +1800 +7000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char126 +ENCODING 126 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3B00 +6E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char127 +ENCODING 127 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 128 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 129 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 130 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 131 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 132 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 133 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 134 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 135 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 136 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 137 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 138 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 139 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 140 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 141 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 142 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 143 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 144 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 145 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 146 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 147 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char0 +ENCODING 148 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 149 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 150 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 151 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char0 +ENCODING 152 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 153 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 154 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 155 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char0 +ENCODING 156 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 157 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 158 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 159 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char160 +ENCODING 160 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +0880 +0880 +0880 +0880 +FF80 +0880 +0880 +0880 +0880 +0880 +FF80 +0880 +0880 +0880 +0880 +ENDCHAR +STARTCHAR char161 +ENCODING 161 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +0000 +1800 +1800 +1800 +3C00 +3C00 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char162 +ENCODING 162 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1800 +1800 +7E00 +C300 +C000 +C000 +C000 +C300 +7E00 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char163 +ENCODING 163 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1C00 +3600 +3200 +3000 +7800 +3000 +3000 +3000 +3000 +7300 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char164 +ENCODING 164 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +4100 +6300 +3E00 +6300 +6300 +6300 +6300 +3E00 +6300 +4100 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char165 +ENCODING 165 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +6600 +3C00 +1800 +FF00 +1800 +FF00 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char166 +ENCODING 166 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +6600 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char167 +ENCODING 167 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3E00 +6300 +3000 +1C00 +3600 +6300 +6300 +3600 +1C00 +0600 +6300 +3E00 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char168 +ENCODING 168 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +7E00 +DB00 +FF00 +BD00 +C300 +E700 +FF00 +7E00 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char169 +ENCODING 169 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +4100 +5D00 +5100 +5100 +5D00 +4100 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char170 +ENCODING 170 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3800 +0C00 +3C00 +6400 +3C00 +0000 +7C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char171 +ENCODING 171 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +1800 +3000 +7F00 +7F00 +3000 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char172 +ENCODING 172 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3C00 +7E00 +5A00 +1800 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char173 +ENCODING 173 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char174 +ENCODING 174 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +4100 +5D00 +5500 +5900 +5500 +4100 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char175 +ENCODING 175 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +7F00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char176 +ENCODING 176 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1C00 +3600 +3600 +1C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char177 +ENCODING 177 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +7E00 +1800 +1800 +0000 +0000 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char178 +ENCODING 178 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3800 +6C00 +1800 +3000 +6400 +7C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char179 +ENCODING 179 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +7C00 +0C00 +1800 +0C00 +6C00 +3800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char180 +ENCODING 180 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1800 +3000 +6000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char181 +ENCODING 181 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +6600 +6600 +6600 +6600 +6600 +7E00 +6300 +6000 +C000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char182 +ENCODING 182 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +DB00 +DB00 +DB00 +7B00 +1B00 +1B00 +1B00 +1B00 +1B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char183 +ENCODING 183 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char184 +ENCODING 184 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0080 +0100 +0300 +0600 +0C00 +1C00 +3000 +7F00 +7700 +0E00 +1C00 +1800 +3000 +6000 +8000 +0000 +ENDCHAR +STARTCHAR char185 +ENCODING 185 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +7000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char186 +ENCODING 186 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3800 +6C00 +4400 +6C00 +3800 +0000 +7C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char187 +ENCODING 187 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0C00 +0600 +7F00 +7F00 +0600 +0C00 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char188 +ENCODING 188 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6000 +6000 +6100 +6300 +6600 +0C00 +1800 +3300 +6700 +4B00 +1F00 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR char189 +ENCODING 189 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6000 +6000 +6100 +6300 +6600 +0C00 +1800 +3000 +6700 +4D80 +0300 +0600 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR char190 +ENCODING 190 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +7800 +1800 +3900 +1B00 +7600 +0C00 +1800 +3300 +6700 +4B00 +1F00 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR char191 +ENCODING 191 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +0000 +1800 +1800 +3000 +6000 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char192 +ENCODING 192 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1800 +0C00 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char193 +ENCODING 193 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char194 +ENCODING 194 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1C00 +3600 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char195 +ENCODING 195 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3B00 +6E00 +0000 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char196 +ENCODING 196 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6300 +0000 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char197 +ENCODING 197 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1C00 +1400 +1C00 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char198 +ENCODING 198 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1F00 +3600 +6600 +6600 +7F00 +6600 +6600 +6600 +6600 +6700 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char199 +ENCODING 199 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6000 +6100 +3300 +1E00 +0600 +0300 +3E00 +0000 +ENDCHAR +STARTCHAR char200 +ENCODING 200 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1800 +0C00 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char201 +ENCODING 201 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char202 +ENCODING 202 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1C00 +3600 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char203 +ENCODING 203 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6300 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char204 +ENCODING 204 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3000 +1800 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char205 +ENCODING 205 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char206 +ENCODING 206 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3C00 +6600 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char207 +ENCODING 207 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6600 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char208 +ENCODING 208 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +3600 +3300 +3300 +7B00 +7B00 +3300 +3300 +3600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char209 +ENCODING 209 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3B00 +6E00 +6300 +7300 +7B00 +7F00 +6F00 +6700 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char210 +ENCODING 210 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3000 +1800 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char211 +ENCODING 211 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0600 +0C00 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char212 +ENCODING 212 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1C00 +3600 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char213 +ENCODING 213 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3B00 +6E00 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char214 +ENCODING 214 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6300 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char215 +ENCODING 215 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +6300 +3600 +1C00 +0800 +1C00 +3600 +6300 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char216 +ENCODING 216 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0100 +0300 +3E00 +6700 +6700 +6F00 +6B00 +6B00 +7B00 +7300 +7300 +3E00 +6000 +4000 +0000 +0000 +ENDCHAR +STARTCHAR char217 +ENCODING 217 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3000 +1800 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char218 +ENCODING 218 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0600 +0C00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char219 +ENCODING 219 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1C00 +1400 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char220 +ENCODING 220 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6300 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char221 +ENCODING 221 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1800 +3000 +C300 +C300 +C300 +6600 +3C00 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char222 +ENCODING 222 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +7800 +3000 +3E00 +3300 +3300 +3300 +3E00 +3000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char223 +ENCODING 223 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +6300 +6700 +6E00 +6C00 +6600 +6300 +6B00 +6E00 +6000 +4000 +0000 +0000 +ENDCHAR +STARTCHAR char224 +ENCODING 224 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +1800 +0C00 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char225 +ENCODING 225 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0C00 +1800 +3000 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char226 +ENCODING 226 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0800 +1C00 +3600 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char227 +ENCODING 227 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3B00 +6E00 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char228 +ENCODING 228 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6600 +0000 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char229 +ENCODING 229 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1C00 +3600 +1C00 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char230 +ENCODING 230 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3B00 +1B00 +7E00 +D800 +DC00 +7700 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char231 +ENCODING 231 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6000 +6000 +6000 +6300 +3E00 +0C00 +0600 +3C00 +0000 +ENDCHAR +STARTCHAR char232 +ENCODING 232 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +1800 +0C00 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char233 +ENCODING 233 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0600 +0C00 +1800 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char234 +ENCODING 234 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0800 +1C00 +3600 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char235 +ENCODING 235 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +0000 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char236 +ENCODING 236 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6000 +3000 +1800 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char237 +ENCODING 237 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0600 +0C00 +1800 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char238 +ENCODING 238 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1800 +3C00 +6600 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char239 +ENCODING 239 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6600 +0000 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char100 +ENCODING 240 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +0600 +0F00 +0600 +3E00 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char241 +ENCODING 241 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3B00 +6E00 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char242 +ENCODING 242 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +1800 +0C00 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char243 +ENCODING 243 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0C00 +1800 +3000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char244 +ENCODING 244 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0800 +1C00 +3600 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char245 +ENCODING 245 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3B00 +6E00 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char246 +ENCODING 246 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char247 +ENCODING 247 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +7E00 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char248 +ENCODING 248 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0100 +0300 +3E00 +6700 +6F00 +6B00 +7B00 +7300 +3E00 +6000 +4000 +0000 +0000 +ENDCHAR +STARTCHAR char249 +ENCODING 249 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +1800 +0C00 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char250 +ENCODING 250 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0C00 +1800 +3000 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char251 +ENCODING 251 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1800 +3C00 +6600 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char252 +ENCODING 252 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6600 +0000 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char253 +ENCODING 253 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0C00 +1800 +3000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +3F00 +0300 +0600 +7C00 +0000 +ENDCHAR +STARTCHAR char254 +ENCODING 254 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +7800 +3000 +3E00 +3300 +3300 +3300 +3300 +3300 +3E00 +3000 +3000 +7800 +0000 +ENDCHAR +STARTCHAR char255 +ENCODING 255 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +0000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +3F00 +0300 +0600 +7C00 +0000 +ENDCHAR +ENDFONT diff --git a/util/alevt/vtxt-latin-2.bdf b/util/alevt/vtxt-latin-2.bdf new file mode 100644 index 0000000..6505c6e --- /dev/null +++ b/util/alevt/vtxt-latin-2.bdf @@ -0,0 +1,5906 @@ +STARTFONT 2.1 +FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-2 +SIZE 1 75 75 +FONTBOUNDINGBOX 9 16 0 -4 +STARTPROPERTIES 10 +POINT_SIZE 1 +PIXEL_SIZE 16 +RESOLUTION_X 75 +RESOLUTION_Y 75 +FONT_ASCENT 12 +FONT_DESCENT 4 +AVERAGE_WIDTH 90 +SPACING "C" +_XMBDFED_INFO "Edited with xmbdfed 3.3." +FONT "vtxt" +ENDPROPERTIES +CHARS 256 +STARTCHAR char0 +ENCODING 0 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 1 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 2 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 3 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 4 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 5 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 6 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 7 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 8 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 9 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 10 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 11 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 12 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 13 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char2 +ENCODING 14 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char1 +ENCODING 15 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 16 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 17 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 18 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 19 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char0 +ENCODING 20 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 21 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 22 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 23 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char0 +ENCODING 24 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 25 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 26 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 27 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char0 +ENCODING 28 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 29 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char2 +ENCODING 30 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char1 +ENCODING 31 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR char32 +ENCODING 32 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char33 +ENCODING 33 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3C00 +3C00 +3C00 +1800 +1800 +1800 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char34 +ENCODING 34 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6600 +6600 +6600 +2400 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char35 +ENCODING 35 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3600 +3600 +7F00 +3600 +3600 +3600 +7F00 +3600 +3600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char36 +ENCODING 36 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0C00 +3E00 +6300 +6100 +6000 +3E00 +0300 +0300 +4300 +6300 +3E00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR char37 +ENCODING 37 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +6100 +6300 +0600 +0C00 +1800 +3000 +6300 +4300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char38 +ENCODING 38 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +3600 +1C00 +3B00 +6E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char39 +ENCODING 39 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3000 +3000 +3000 +6000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char40 +ENCODING 40 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0C00 +1800 +3000 +3000 +3000 +3000 +3000 +3000 +1800 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char41 +ENCODING 41 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3000 +1800 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +1800 +3000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char42 +ENCODING 42 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6600 +3C00 +FF00 +3C00 +6600 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char43 +ENCODING 43 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +1800 +1800 +7E00 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char44 +ENCODING 44 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +1800 +3000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char45 +ENCODING 45 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7F00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char46 +ENCODING 46 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char47 +ENCODING 47 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0100 +0300 +0600 +0C00 +1800 +3000 +6000 +4000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char48 +ENCODING 48 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +6600 +C300 +C300 +DB00 +DB00 +C300 +C300 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char49 +ENCODING 49 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +3800 +7800 +1800 +1800 +1800 +1800 +1800 +1800 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char50 +ENCODING 50 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +0300 +0600 +0C00 +1800 +3000 +6000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char51 +ENCODING 51 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +0300 +0300 +1E00 +0300 +0300 +0300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char52 +ENCODING 52 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0E00 +1E00 +3600 +6600 +7F00 +0600 +0600 +0600 +0F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char53 +ENCODING 53 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +6000 +6000 +6000 +7E00 +0300 +0300 +0300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char54 +ENCODING 54 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3000 +6000 +6000 +7E00 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char55 +ENCODING 55 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +6300 +0300 +0300 +0600 +0C00 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char56 +ENCODING 56 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +3E00 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char57 +ENCODING 57 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +3F00 +0300 +0300 +0300 +0600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char58 +ENCODING 58 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char59 +ENCODING 59 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +0000 +0000 +1800 +1800 +1800 +3000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char60 +ENCODING 60 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0600 +0C00 +1800 +3000 +6000 +3000 +1800 +0C00 +0600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char61 +ENCODING 61 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7E00 +0000 +0000 +7E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char62 +ENCODING 62 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +6000 +3000 +1800 +0C00 +0600 +0C00 +1800 +3000 +6000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char63 +ENCODING 63 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +0600 +0C00 +0C00 +0C00 +0000 +0C00 +0C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char64 +ENCODING 64 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3E00 +6300 +6300 +6F00 +6F00 +6F00 +6E00 +6000 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char65 +ENCODING 65 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char66 +ENCODING 66 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3300 +3300 +3300 +3300 +7E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char67 +ENCODING 67 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6000 +6000 +6100 +3300 +1E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char68 +ENCODING 68 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7C00 +3600 +3300 +3300 +3300 +3300 +3300 +3300 +3600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char69 +ENCODING 69 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char70 +ENCODING 70 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char71 +ENCODING 71 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6F00 +6300 +6300 +3300 +1D00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char72 +ENCODING 72 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +6300 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char73 +ENCODING 73 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char74 +ENCODING 74 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0F00 +0600 +0600 +0600 +0600 +0600 +6600 +6600 +6600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char75 +ENCODING 75 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7300 +3300 +3300 +3600 +3C00 +3C00 +3600 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char76 +ENCODING 76 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7800 +3000 +3000 +3000 +3000 +3000 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char77 +ENCODING 77 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +E700 +FF00 +FF00 +DB00 +C300 +C300 +C300 +C300 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char78 +ENCODING 78 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +7300 +7B00 +7F00 +6F00 +6700 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char79 +ENCODING 79 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char80 +ENCODING 80 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char81 +ENCODING 81 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6B00 +6F00 +3E00 +0600 +0700 +0000 +0000 +ENDCHAR +STARTCHAR char82 +ENCODING 82 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7E00 +3300 +3300 +3300 +3E00 +3600 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char83 +ENCODING 83 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +3000 +1C00 +0600 +0300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char84 +ENCODING 84 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +DB00 +9900 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char85 +ENCODING 85 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char86 +ENCODING 86 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +C300 +C300 +C300 +C300 +6600 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char87 +ENCODING 87 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +C300 +C300 +DB00 +DB00 +FF00 +6600 +6600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char88 +ENCODING 88 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +6600 +3C00 +1800 +1800 +3C00 +6600 +C300 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char89 +ENCODING 89 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +C300 +C300 +C300 +6600 +3C00 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char90 +ENCODING 90 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +C300 +8600 +0C00 +1800 +3000 +6000 +C100 +C300 +FF00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char91 +ENCODING 91 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char92 +ENCODING 92 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +4000 +6000 +7000 +3800 +1C00 +0E00 +0700 +0300 +0100 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char93 +ENCODING 93 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char94 +ENCODING 94 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0800 +1C00 +3600 +6300 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char95 +ENCODING 95 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +0000 +0000 +ENDCHAR +STARTCHAR char96 +ENCODING 96 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3000 +3000 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char97 +ENCODING 97 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char98 +ENCODING 98 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3C00 +3600 +3300 +3300 +3300 +3300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char99 +ENCODING 99 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6000 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char100 +ENCODING 100 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +0600 +0600 +1E00 +3600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char101 +ENCODING 101 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char102 +ENCODING 102 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +3200 +3000 +7800 +3000 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char103 +ENCODING 103 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B00 +6600 +6600 +6600 +6600 +6600 +3E00 +0600 +6600 +3C00 +0000 +ENDCHAR +STARTCHAR char104 +ENCODING 104 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3600 +3B00 +3300 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char105 +ENCODING 105 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char106 +ENCODING 106 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0600 +0000 +0E00 +0600 +0600 +0600 +0600 +0600 +0600 +6600 +6600 +3C00 +0000 +ENDCHAR +STARTCHAR char107 +ENCODING 107 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +3000 +3000 +3300 +3600 +3C00 +3C00 +3600 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char108 +ENCODING 108 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char109 +ENCODING 109 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +E600 +FF00 +DB00 +DB00 +DB00 +DB00 +DB00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char110 +ENCODING 110 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char111 +ENCODING 111 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char112 +ENCODING 112 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3E00 +3000 +3000 +7800 +0000 +ENDCHAR +STARTCHAR char113 +ENCODING 113 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B00 +6600 +6600 +6600 +6600 +6600 +3E00 +0600 +0600 +0F00 +0000 +ENDCHAR +STARTCHAR char114 +ENCODING 114 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6E00 +3B00 +3300 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char115 +ENCODING 115 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +3000 +1C00 +0600 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char116 +ENCODING 116 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1800 +1800 +7E00 +1800 +1800 +1800 +1800 +1B00 +0E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char117 +ENCODING 117 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char118 +ENCODING 118 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +C300 +C300 +C300 +6600 +3C00 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char119 +ENCODING 119 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +C300 +C300 +DB00 +DB00 +FF00 +6600 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char120 +ENCODING 120 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +C300 +6600 +3C00 +1800 +3C00 +6600 +C300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char121 +ENCODING 121 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +3F00 +0300 +0600 +7C00 +0000 +ENDCHAR +STARTCHAR char122 +ENCODING 122 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +7F00 +6600 +0C00 +1800 +3000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char123 +ENCODING 123 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +1800 +1800 +1800 +7000 +1800 +1800 +1800 +1800 +0E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char124 +ENCODING 124 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char125 +ENCODING 125 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7000 +1800 +1800 +1800 +0E00 +1800 +1800 +1800 +1800 +7000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char126 +ENCODING 126 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3B00 +6E00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char127 +ENCODING 127 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +7F00 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char0 +ENCODING 128 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 129 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 130 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 131 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 132 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 133 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 134 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 135 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 136 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 137 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 138 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 139 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 140 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 141 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char2 +ENCODING 142 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char1 +ENCODING 143 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR char0 +ENCODING 144 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 145 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 146 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 147 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char0 +ENCODING 148 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 149 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 150 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 151 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +F000 +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char0 +ENCODING 152 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 153 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 154 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 155 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char0 +ENCODING 156 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 157 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +F000 +F000 +F000 +F000 +F000 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char2 +ENCODING 158 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char1 +ENCODING 159 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR char160 +ENCODING 160 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +FF80 +0880 +0880 +0880 +0880 +FF80 +0880 +0880 +0880 +0880 +0880 +FF80 +0880 +0880 +0880 +0880 +ENDCHAR +STARTCHAR char65 +ENCODING 161 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0600 +0300 +0000 +0000 +ENDCHAR +STARTCHAR char162 +ENCODING 162 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6600 +3C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char76 +ENCODING 163 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7800 +3000 +3000 +3C00 +3800 +3000 +7000 +F100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char164 +ENCODING 164 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +4100 +6300 +3E00 +6300 +6300 +6300 +6300 +3E00 +6300 +4100 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char76 +ENCODING 165 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7B00 +3300 +3600 +3000 +3000 +3000 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char83 +ENCODING 166 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +3E00 +6300 +6300 +3000 +1C00 +0600 +0300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char167 +ENCODING 167 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3E00 +6300 +3000 +1C00 +3600 +6300 +6300 +3600 +1C00 +0600 +6300 +3E00 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char196 +ENCODING 168 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6300 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char169 +ENCODING 169 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6600 +3C00 +3E00 +6300 +6300 +3000 +1C00 +0600 +0300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char83 +ENCODING 170 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3E00 +6300 +6300 +3000 +1C00 +0600 +0300 +6300 +6300 +3E00 +0600 +0300 +3E00 +0000 +ENDCHAR +STARTCHAR char171 +ENCODING 171 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6600 +3C00 +FF00 +DB00 +9900 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char90 +ENCODING 172 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +FF00 +C300 +8600 +0C00 +1800 +3000 +6000 +C100 +C300 +FF00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char173 +ENCODING 173 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FF80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char174 +ENCODING 174 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6600 +3C00 +FF00 +C300 +8600 +0C00 +1800 +3000 +6000 +C100 +C300 +FF00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char90 +ENCODING 175 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +C300 +8600 +0C00 +7E00 +3000 +6000 +C100 +C300 +FF00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char176 +ENCODING 176 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1C00 +3600 +3600 +1C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char97 +ENCODING 177 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0600 +0300 +0000 +0000 +ENDCHAR +STARTCHAR char97 +ENCODING 178 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0C00 +1800 +0E00 +0000 +0000 +ENDCHAR +STARTCHAR char108 +ENCODING 179 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3800 +1800 +1E00 +1C00 +1800 +3800 +7800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char180 +ENCODING 180 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1800 +3000 +6000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char108 +ENCODING 181 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3980 +1980 +1B00 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char115 +ENCODING 182 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0C00 +0000 +3E00 +6300 +3000 +1C00 +0600 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char171 +ENCODING 183 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6600 +3C00 +1800 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char184 +ENCODING 184 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0080 +0100 +0300 +0600 +0C00 +1C00 +3000 +7F00 +7700 +0E00 +1C00 +1800 +3000 +6000 +8000 +0000 +ENDCHAR +STARTCHAR char185 +ENCODING 185 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3600 +1C00 +3E00 +6300 +3000 +1C00 +0600 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char115 +ENCODING 186 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +3000 +1C00 +0600 +6300 +3E00 +0300 +1E00 +0000 +0000 +ENDCHAR +STARTCHAR char187 +ENCODING 187 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0180 +0980 +1B00 +1800 +7E00 +1800 +1800 +1800 +1800 +1B00 +0E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char122 +ENCODING 188 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0C00 +0000 +7F00 +6600 +0C00 +1800 +3000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char189 +ENCODING 189 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +3300 +6600 +CC00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char190 +ENCODING 190 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +6600 +3C00 +7F00 +6600 +0C00 +1800 +3000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char122 +ENCODING 191 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0C00 +0C00 +0000 +7F00 +6600 +0C00 +1800 +3000 +6300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char82 +ENCODING 192 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0600 +0C00 +7E00 +3300 +3300 +3300 +3E00 +3600 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char193 +ENCODING 193 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0300 +0600 +0000 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char194 +ENCODING 194 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1C00 +3600 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char195 +ENCODING 195 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6300 +3E00 +0000 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char196 +ENCODING 196 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6300 +0000 +0800 +1C00 +3600 +6300 +6300 +7F00 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char76 +ENCODING 197 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +7C00 +3000 +3000 +3000 +3000 +3000 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char67 +ENCODING 198 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0600 +0C00 +1E00 +3300 +6100 +6000 +6000 +6000 +6000 +6100 +3300 +1E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char199 +ENCODING 199 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +1E00 +3300 +6100 +6000 +6000 +6000 +6100 +3300 +1E00 +0600 +0300 +3E00 +0000 +ENDCHAR +STARTCHAR char200 +ENCODING 200 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3300 +1E00 +1E00 +3300 +6100 +6000 +6000 +6000 +6000 +6100 +3300 +1E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char201 +ENCODING 201 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char202 +ENCODING 202 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0C00 +0600 +0000 +0000 +ENDCHAR +STARTCHAR char203 +ENCODING 203 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6300 +0000 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char204 +ENCODING 204 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3300 +1E00 +7F00 +3300 +3100 +3400 +3C00 +3400 +3000 +3100 +3300 +7F00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char205 +ENCODING 205 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char206 +ENCODING 206 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3C00 +6600 +0000 +3C00 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char207 +ENCODING 207 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6600 +3C00 +7C00 +3600 +3300 +3300 +3300 +3300 +3300 +3300 +3600 +7C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char208 +ENCODING 208 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3C00 +3600 +3300 +3300 +7B00 +7B00 +3300 +3300 +3600 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char78 +ENCODING 209 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +6300 +7300 +7B00 +7F00 +6F00 +6700 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char210 +ENCODING 210 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6600 +3C00 +6300 +7300 +7B00 +7F00 +6F00 +6700 +6300 +6300 +6300 +6300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char211 +ENCODING 211 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0600 +0C00 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char212 +ENCODING 212 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1C00 +3600 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char213 +ENCODING 213 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +3300 +6600 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char214 +ENCODING 214 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6300 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char215 +ENCODING 215 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +6300 +3600 +1C00 +0800 +1C00 +3600 +6300 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char216 +ENCODING 216 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6600 +3C00 +7E00 +3300 +3300 +3300 +3E00 +3600 +3300 +3300 +3300 +7300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char217 +ENCODING 217 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0800 +1400 +6B00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char218 +ENCODING 218 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0600 +0C00 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char219 +ENCODING 219 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1B00 +3600 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char220 +ENCODING 220 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +6300 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char221 +ENCODING 221 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +1800 +3000 +C300 +C300 +C300 +6600 +3C00 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char84 +ENCODING 222 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +FF00 +DB00 +9900 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0600 +3C00 +0000 +0000 +ENDCHAR +STARTCHAR char223 +ENCODING 223 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +1C00 +3600 +6300 +6700 +6E00 +6C00 +6600 +6300 +6B00 +6E00 +6000 +4000 +0000 +0000 +ENDCHAR +STARTCHAR char224 +ENCODING 224 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0C00 +1800 +6E00 +3B00 +3300 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char225 +ENCODING 225 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0C00 +1800 +3000 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char226 +ENCODING 226 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0800 +1C00 +3600 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char227 +ENCODING 227 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6600 +3C00 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char228 +ENCODING 228 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6600 +0000 +0000 +3C00 +0600 +3E00 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char108 +ENCODING 229 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0C00 +1800 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char99 +ENCODING 230 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0C00 +0000 +3E00 +6300 +6000 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char231 +ENCODING 231 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +6000 +6000 +6000 +6300 +3E00 +0C00 +0600 +3C00 +0000 +ENDCHAR +STARTCHAR char232 +ENCODING 232 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +6600 +3C00 +3E00 +6300 +6000 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char233 +ENCODING 233 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0600 +0C00 +1800 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char234 +ENCODING 234 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +1800 +0E00 +0000 +0000 +ENDCHAR +STARTCHAR char235 +ENCODING 235 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +0000 +0000 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char236 +ENCODING 236 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3300 +1E00 +3E00 +6300 +7F00 +6000 +6000 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char237 +ENCODING 237 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0600 +0C00 +1800 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char238 +ENCODING 238 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1800 +3C00 +6600 +0000 +3800 +1800 +1800 +1800 +1800 +1800 +3C00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char239 +ENCODING 239 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +6000 +6E00 +3600 +0600 +1E00 +3600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char100 +ENCODING 240 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0E00 +0600 +0F00 +0600 +3E00 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char241 +ENCODING 241 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0C00 +0000 +6E00 +3300 +3300 +3300 +3300 +3300 +3300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char242 +ENCODING 242 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3300 +1E00 +6E00 +3300 +3300 +3300 +3300 +3300 +3300 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char243 +ENCODING 243 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0600 +0C00 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char244 +ENCODING 244 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0800 +1C00 +3600 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char245 +ENCODING 245 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3300 +6600 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char246 +ENCODING 246 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6300 +0000 +0000 +3E00 +6300 +6300 +6300 +6300 +6300 +3E00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char247 +ENCODING 247 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +0000 +1800 +1800 +0000 +7E00 +0000 +1800 +1800 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char248 +ENCODING 248 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0000 +3300 +1E00 +6E00 +3B00 +3300 +3000 +3000 +3000 +7800 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char249 +ENCODING 249 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +1800 +2400 +2400 +1800 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char250 +ENCODING 250 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0C00 +1800 +3000 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char251 +ENCODING 251 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +3300 +6600 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char252 +ENCODING 252 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +6600 +0000 +0000 +6600 +6600 +6600 +6600 +6600 +6600 +3B00 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR char253 +ENCODING 253 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0C00 +1800 +3000 +0000 +6300 +6300 +6300 +6300 +6300 +6300 +3F00 +0300 +0600 +7C00 +0000 +ENDCHAR +STARTCHAR char116 +ENCODING 254 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0000 +0800 +1800 +1800 +7E00 +1800 +1800 +1800 +1800 +1B00 +0E00 +0300 +1E00 +0000 +0000 +ENDCHAR +STARTCHAR char255 +ENCODING 255 +SWIDTH 8640 0 +DWIDTH 9 0 +BBX 9 16 0 -4 +BITMAP +0000 +0C00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +ENDFONT diff --git a/util/alevt/xio.c b/util/alevt/xio.c new file mode 100644 index 0000000..4c0bca2 --- /dev/null +++ b/util/alevt/xio.c @@ -0,0 +1,1156 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <signal.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xatom.h> +#define XK_MISCELLANY +#define XK_LATIN1 +#include <X11/keysymdef.h> +#include <sys/time.h> +#include "vt.h" +#include "misc.h" +#include "dllist.h" +#include "xio.h" +#include "fdset.h" +#include "lang.h" +#include "icon.xbm" +#include "font.h" + +#define WW (W*CW) /* pixel width of window */ +#define WH (H*CH) /* pixel hegiht of window */ +#define NO_SEL 999 /* sel_y1 value if no selection */ +#define SEL_MIN_TIME 500 /* anything shorter is a click */ + +static struct dl_head dpys[1]; /* list of all displays */ +static void xio_timer(void *data, int fd); +static void handle_event(struct xio *xio, int fd); + + +static int timer_init(int argc, char **argv) +{ +    int p[2], timer_pid, i; + +    if (pipe(p) == -1) +    return -1; + +    signal(SIGPIPE, SIG_DFL); +    timer_pid = fork(); +    if (timer_pid == -1) +    return -1; +    if (timer_pid > 0) +    { +    fdset_add_fd(fds, p[0], xio_timer, 0); +    close(p[1]); +    return 0; +    } + +    close(p[0]); +    for (i = 0; i < 32; ++i) +    if (p[1] != i) +    close(i); +    memcpy(argv[0], "Timer", 6); + +    for (;;) +    { +    usleep(300000); +    write(p[1], "*", 1); +    } +} + + +static int local_init(int argc, char **argv) +{ +    static int inited = 0; + +    if (inited) +	return 0; + +    if (timer_init(argc, argv) == -1) +	return -1; + +    dl_init(dpys); + +    inited = 1; +    return 0; +} + + +static int get_colors(struct xio *xio) +{ +    int i; +    XColor c; + +    static short rgb[][3] = +    { +	{ 0x0000,0x0000,0x0000 }, +	{ 0xffff,0x0000,0x0000 }, +	{ 0x0000,0xffff,0x0000 }, +	{ 0xffff,0xffff,0x0000 }, +	{ 0x0000,0x0000,0xffff }, +	{ 0xffff,0x0000,0xffff }, +	{ 0x0000,0xffff,0xffff }, +	{ 0xffff,0xffff,0xffff }, +	{ 0x7fff,0x7fff,0x7fff }, +	{ 0x7fff,0x0000,0x0000 }, +	{ 0x0000,0x7fff,0x0000 }, +	{ 0x7fff,0x7fff,0x0000 }, +	{ 0x0000,0x0000,0x7fff }, +	{ 0x7fff,0x0000,0x7fff }, +	{ 0x0000,0x7fff,0x7fff }, +	{ 0x3fff,0x3fff,0x3fff }, +    }; + +    for (i = 0; i < 16; ++i) +    { +	c.red = rgb[i][0]; +	c.green = rgb[i][1]; +	c.blue = rgb[i][2]; +	if (XAllocColor(xio->dpy, xio->cmap, &c) == 0) +	    return -1; +	xio->color[i] = c.pixel; +    } +    return 0; +} + + +static int get_fonts(struct xio *xio) +{ +    GC gc; +    int i; +    unsigned char *font_bits; +    switch(latin1) { +        case LATIN1: font_bits=font1_bits; break; +        case LATIN2: font_bits=font2_bits; break; +        case KOI8: font_bits=font3_bits; break; +        case GREEK: font_bits=font4_bits; break; +        default: font_bits=font1_bits; break; +    } + +    xio->font[0] = XCreateBitmapFromData(xio->dpy, xio->root, +					 font_bits, font_width, font_height); +    xio->font[1] = XCreatePixmap(xio->dpy, xio->root, +    					font_width, font_height*2, 1); +    gc = XCreateGC(xio->dpy, xio->font[0], 0, 0); +    for (i = 0; i < font_height; ++i) +    { +	XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i, +						    font_width, 1, 0, i*2); +	XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i, +						    font_width, 1, 0, i*2+1); +    } +    XFreeGC(xio->dpy, gc); +    return 0; +} + + +static void xlib_conn_watch(Display *dpy, void *fds, int fd, int open_flag, void *data) +{ +    if (open_flag) +	fdset_add_fd(fds, fd, XProcessInternalConnection, dpy); +    else +	fdset_del_fd(fds, fd); +} + + +struct xio * xio_open_dpy(char *dpy, int argc, char **argv) +{ +    XClassHint classhint[1]; +    struct xio *xio; + +    if (local_init(argc, argv) == -1) +	goto fail1; +     +    if (not(xio = malloc(sizeof(*xio)))) +	goto fail1; + +    if (not(xio->dpy = XOpenDisplay(dpy))) +	goto fail2; + +    xio->fd = ConnectionNumber(xio->dpy); +    xio->argc = argc; +    xio->argv = argv; +    dl_init(xio->windows); +    xio->screen = DefaultScreen(xio->dpy); +    xio->depth = DefaultDepth(xio->dpy, xio->screen); +    xio->width = DisplayWidth(xio->dpy, xio->screen); +    xio->height = DisplayHeight(xio->dpy, xio->screen); +    xio->root = DefaultRootWindow(xio->dpy); +    xio->cmap = DefaultColormap(xio->dpy, xio->screen); +    xio->xa_del_win = XInternAtom(xio->dpy, "WM_DELETE_WINDOW", False); +    xio->xa_targets = XInternAtom(xio->dpy, "TARGETS", False); +    xio->xa_timestamp = XInternAtom(xio->dpy, "TIMESTAMP", False); +    xio->xa_multiple = XInternAtom(xio->dpy, "MULTIPLE", False); +    xio->xa_text = XInternAtom(xio->dpy, "TEXT", False); + +    if (get_colors(xio) == -1) +	goto fail3; + +    if (get_fonts(xio) == -1) +	goto fail3; + +    if (fdset_add_fd(fds, xio->fd, handle_event, xio) == -1) +	goto fail3; +     +    XAddConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds); +	 +    xio->icon = XCreateBitmapFromData(xio->dpy, xio->root, +					icon_bits, icon_width, icon_height); + +    xio->group_leader = XCreateSimpleWindow(xio->dpy, xio->root, +    							0, 0, 1, 1, 0, 0, 0); +    XSetCommand(xio->dpy, xio->group_leader, xio->argv, xio->argc); +    classhint->res_name = "VTLeader"; +    classhint->res_class = "AleVT"; +    XSetClassHint(xio->dpy, xio->group_leader, classhint); + +    dl_insert_first(dpys, xio->node); +    return xio; + +fail4: +    fdset_del_fd(fds, xio->fd); +fail3: +    XCloseDisplay(xio->dpy); +fail2: +    free(xio); +fail1: +    return 0; +} + + +static void set_user_geometry(struct xio_win *xw, char *geom, XSizeHints *sh, int bwidth) +{ +    static int gravs[] = { NorthWestGravity, NorthEastGravity, +			   SouthWestGravity, SouthEastGravity }; +    int f, g = 0; + +    f = XParseGeometry(geom, &sh->x, &sh->y, &sh->width, &sh->height); + +    if (f & WidthValue) +	sh->width = sh->base_width + sh->width * sh->width_inc; +    if (f & HeightValue) +	sh->height = sh->base_height + sh->height * sh->height_inc; +    if (f & XNegative) +	g+=1, sh->x = xw->xio->width + sh->x - sh->width - bwidth; +    if (f & YNegative) +	g+=2, sh->y = xw->xio->height + sh->y - sh->height - bwidth; + +    sh->width = bound(sh->min_width, sh->width, sh->max_width); +    sh->height = bound(sh->min_height, sh->height, sh->max_height); + +    if (f & (WidthValue | HeightValue)) +	sh->flags |= USSize; +    if (f & (XValue | YValue)) +	sh->flags |= USPosition | PWinGravity; + +    sh->win_gravity = gravs[g]; +} + + +struct xio_win * xio_open_win(struct xio *xio, char *geom) +{ +    struct xio_win *xw; +    XSetWindowAttributes attr; +    XGCValues gcval; +    XSizeHints sizehint[1]; +    XClassHint classhint[1]; +    XWMHints wmhint[1]; + +    if (not(xw = malloc(sizeof(*xw)))) +	goto fail1; + +    xw->xio = xio; + +    sizehint->flags = PSize | PBaseSize | PMinSize | PMaxSize | PResizeInc; +    sizehint->x = sizehint->y = 0; +    sizehint->width_inc = CW; +    sizehint->height_inc = CH; +    sizehint->base_width = 0; +    sizehint->base_height = 0; +    sizehint->min_width = 11*CW; +    sizehint->min_height = 1*CH; +    sizehint->max_width = sizehint->width = WW + CW; +    sizehint->max_height = sizehint->height = WH; +    set_user_geometry(xw, geom, sizehint, 1); + +    attr.background_pixel = xio->color[0]; +    attr.event_mask = KeyPressMask | +    			 ButtonPressMask|ButtonReleaseMask|Button1MotionMask | +			 ExposureMask; +    xw->win = XCreateWindow(xio->dpy, xio->root, +		sizehint->x, sizehint->y, sizehint->width, sizehint->height, 1, +			CopyFromParent, CopyFromParent, CopyFromParent, +			CWBackPixel|CWEventMask, &attr); + +    classhint->res_name = "VTPage"; +    classhint->res_class = "AleVT"; + +    wmhint->flags = InputHint | StateHint | WindowGroupHint | IconPixmapHint; +    wmhint->input = True; +    wmhint->initial_state = NormalState; //IconicState; +    wmhint->window_group = xio->group_leader; +    wmhint->icon_pixmap = xio->icon; + +    XSetWMProperties(xio->dpy, xw->win, 0,0, 0,0, sizehint, wmhint, classhint); +    XSetWMProtocols(xio->dpy, xw->win, &xio->xa_del_win, 1); + +    xw->title[0] = 0; +    xio_title(xw, "AleVT"); // will be reset pretty soon + +    gcval.graphics_exposures = False; +    xw->gc = XCreateGC(xio->dpy, xw->win, GCGraphicsExposures, &gcval); + +    xw->tstamp = CurrentTime; +    xw->fg = xw->bg = -1;	/* unknown colors */ + +    xw->curs_x = xw->curs_y = 999;	// no cursor + +    xw->sel_y1 = NO_SEL;	/* no selection area */ +    xw->sel_start_t = 0;	/* no selection-drag active */ +    xw->sel_set_t = 0;		/* not selection owner */ +    xw->sel_pixmap = 0;		/* no selection pixmap yet */ + +    xio_clear_win(xw); +    xw->blink_on = xw->reveal = 0; + +    xw->handler = 0; + +    XMapWindow(xio->dpy, xw->win); +    dl_insert_first(xio->windows, xw->node); +    return xw; + +fail2: +    free(xw); +fail1: +    return 0; +} + + +void xio_close_win(struct xio_win *xw, int dpy_too) +{ +    struct xio *xio = xw->xio; + +    XDestroyWindow(xio->dpy, xw->win); +    dl_remove(xw->node); +    free(xw); + +    if (dpy_too && dl_empty(xio->windows)) +	xio_close_dpy(xio); +} + + +void xio_close_dpy(struct xio *xio) +{ +    while (not dl_empty(xio->windows)) +	xio_close_win((struct xio_win *)xio->windows->first, 0); + +    XDestroyWindow(xio->dpy, xio->group_leader); +    XRemoveConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds); +    fdset_del_fd(fds, xio->fd); +    dl_remove(xio->node); +    free(xio); +} + + +void xio_set_handler(struct xio_win *xw, void *handler, void *data) +{ +    xw->handler = handler; +    xw->data = data; +} + + +void xio_title(struct xio_win *xw, char *title) +{ +    char buf[sizeof(xw->title) + 32]; + +    if (strlen(title) >= sizeof(xw->title)) +	return; //TODO: trimm... +    if (strcmp(xw->title, title) == 0) +	return; + +    strcpy(xw->title, title); +    sprintf(buf, "AleVT " VERSION "    %s", xw->title); +    XStoreName(xw->xio->dpy, xw->win, buf); +    XSetIconName(xw->xio->dpy, xw->win, xw->title); +} + + +void xio_clear_win(struct xio_win *xw) +{ +    memset(xw->ch, ' ', sizeof(xw->ch)); +    xw->dheight = xw->blink = xw->concealed = 0; +    xw->hidden = xw->lhidden = 0; +    xw->modified = ALL_LINES; +} + + +void xio_put_line(struct xio_win *xw, int y, u8 *data) +{ +    u8 *p = xw->ch + y*W; +    u8 *ep = p + W; +    lbits yb = 1 << y; +    lbits x = xw->dheight; + +    if (y < 0 || y >= H) +	return; + +    if (memcmp(data, p, ep - p) == 0) +	return; + +    xw->modified |= yb; +    xw->blink &= ~yb; +    xw->dheight &= ~yb; +    xw->concealed &= ~yb; + +    while (p < ep) +	switch (*p++ = *data++) +	{ +	    case 0x08: +		xw->blink |= yb; +		break; +	    case 0x0d: +		if (y < H-1) +		    xw->dheight |= yb; +		break; +	    case 0x18: +	    	xw->concealed |= yb; +		break; +	} + +    if ((xw->dheight ^ x) & yb) // dheight has changed, recalc hidden +    { +	xw->hidden &= yb*2 - 1; +	for (; yb & ALL_LINES/2; yb *= 2) +	    if (~xw->hidden & xw->dheight & yb) +		xw->hidden |= yb*2; +    } +} + + +void xio_put_str(struct xio_win *xw, int y, u8 *str) +{ +    u8 buf[W]; +    int l; +    l = strlen(str); +    if (l < W) +    { +	memcpy(buf, str, l); +	memset(buf + l, ' ', W - l); +    } +    else +	memcpy(buf, str, W); +    xio_put_line(xw, y, buf); +} + + +static void dirty(struct xio_win *xw, int y1, int y2) // mark [y1,y2[ dirty +{ +    if (y1 >= 0 && y1 < H && y1 < y2) +    { +	if (y2 > H) +	    y2 = H; +	if (xw->hidden & (1 << y1)) +	    y1--; +	while (y1 < y2) +	    xw->modified |= 1 << y1++; +    } +} + + +int xio_get_line(struct xio_win *xw, int y, u8 *data) +{ +    if (y < 0 || y >= H) +	return -1; +    if (xw->hidden & (1 << y)) +	y--; +    memcpy(data, xw->ch + y*W, 40); +    return 0; +} + + +void xio_set_cursor(struct xio_win *xw, int x, int y) +{ +    if (xw->curs_y >= 0 && xw->curs_y < H) +	dirty(xw, xw->curs_y, xw->curs_y + 1); +    if (x >= 0 && x < W && y >= 0 && y < H) +	dirty(xw, y, y + 1); +    else +	x = y = 999; +    xw->curs_x = x; +    xw->curs_y = y; +} + + +static inline void draw_char(struct xio_win *xw, Window win, int fg, int bg, +    int c, int dbl, int x, int y, int ry) +{ +    struct xio *xio = xw->xio; + +    if (fg != xw->fg) +	XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = fg]); +    if (bg != xw->bg) +	XSetBackground(xio->dpy, xw->gc, xio->color[xw->bg = bg]); + +    if (dbl) +    { +	XCopyPlane(xio->dpy, xio->font[1], win, xw->gc, +				c%32*CW, c/32*CH*2, CW, CH*2, x*CW, y*CH, 1); +    } +    else +    { +	XCopyPlane(xio->dpy, xio->font[0], win, xw->gc, +				    c%32*CW, c/32*CH, CW, CH, x*CW, y*CH, 1); +	if (xw->dheight & (1<<ry)) +	    XCopyPlane(xio->dpy, xio->font[0], win, xw->gc, +			    ' '%32*CW, ' '/32*CH, CW, CH, x*CW, y*CH+CH, 1); +    } +} + +static void draw_cursor(struct xio_win *xw, int x, int y, int dbl) +{ +    struct xio *xio = xw->xio; + +    if (xw->blink_on) +	XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = xw->bg ^ 8]); +    XDrawRectangle(xio->dpy, xw->win, xw->gc, x * CW, y * CH, CW-1, +    		(dbl ? 2*CH : CH)-1); +} + + +void xio_update_win(struct xio_win *xw) +{ +    u8 *p = xw->ch; +    lbits yb, redraw; +    int x, y, c; + +    if (xw->modified == 0) +	return; + +    redraw = xw->modified; // all modified lines +    redraw |= xw->lhidden; // all previously hidden lines +    redraw &= ~xw->hidden; + +    xw->lhidden = xw->hidden; +    xw->modified = 0; + +    if (redraw == 0) +	return; + +    for (yb = 1, y = 0; y < H; ++y, yb *= 2) +	if (redraw & yb) +	{ +	    int fg = 7, bg = 0, _fg, _bg; +	    int dbl = 0, blk = 0, con = 0, gfx = 0, sep = 0, hld = 0; +	    int last_ch = ' '; + +	    for (x = 0; x < W; ++x) +	    { +		switch (c = *p++) +		{ +		    case 0x00 ... 0x07: /* alpha + foreground color */ +			fg = c & 7; +			gfx = 0; +			con = 0; +			goto ctrl; +		    case 0x08: /* flash */ +			blk = not xw->blink_on; +			goto ctrl; +		    case 0x09: /* steady */ +			blk = 0; +			goto ctrl; +		    case 0x0a: /* end box */ +		    case 0x0b: /* start box */ +			goto ctrl; +		    case 0x0c: /* normal height */ +			dbl = 0; +			goto ctrl; +		    case 0x0d: /* double height */ +			dbl = y < H-1; +			goto ctrl; +		    case 0x10 ... 0x17: /* graphics + foreground color */ +			fg = c & 7; +			gfx = 1; +			con = 0; +			goto ctrl; +		    case 0x18: /* conceal display */ +			con = not xw->reveal; +			goto ctrl; +		    case 0x19: /* contiguous graphics */ +			sep = 0; +			goto ctrl; +		    case 0x1a: /* separate graphics */ +			sep = 1; +			goto ctrl; +		    case 0x1c: /* black background */ +			bg = 0; +			goto ctrl; +		    case 0x1d: /* new background */ +			bg = fg; +			goto ctrl; +		    case 0x1e: /* hold graphics */ +			hld = 1; +			goto ctrl; +		    case 0x1f: /* release graphics */ +			hld = 0; +			goto ctrl; + +		    case 0x0e: /* SO (reserved, double width) */ +		    case 0x0f: /* SI (reserved, double size) */ +		        c= ' '; break; +		    case 0x1b: /* ESC (reserved) */ +			c = ' '; +			break; + +		    ctrl: +			c = ' '; +			if (hld && gfx) +			    c = last_ch; +			break; + +		    case 0x80 ... 0x9f: /* these aren't used */ +			c = BAD_CHAR; +			break; + +		    default: /* mapped to selected font */ +			break; +		} + +		if (gfx && (c & 0xa0) == 0x20) +		{ +		    last_ch = c; +		    c += (c & 0x40) ? 32 : -32; +		} + +		_fg = fg; +		_bg = bg; +		if (blk) +		    _fg |= 8; +		if (y >= xw->sel_y1 && y < xw->sel_y2 && +		    x >= xw->sel_x1 && x < xw->sel_x2) +		    _bg |= 8; +		if (con) +		    _fg = _bg; +		 +		draw_char(xw, xw->win, _fg, _bg, c, dbl, x, y, y); + +		if (y == xw->curs_y && x == xw->curs_x) +		    draw_cursor(xw, xw->curs_x, xw->curs_y, dbl); + +		if (xw->sel_pixmap && (_bg & 8)) +		    draw_char(xw, xw->sel_pixmap, con ? bg : fg, bg, c, dbl, +					    x - xw->sel_x1, y - xw->sel_y1, y); +	    } +	} +	else +	    p += 40; +} + + +static void for_all_windows(void (*func)(struct xio_win *xw), struct xio_win *except) +{ +    struct xio *xio, *vtn; +    struct xio_win *xw, *vwn; + +    for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn) +	for (xw = PTR xio->windows->first; vwn = PTR xw->node->next; xw = vwn) +	    if (xw != except) +		func(xw); +} + + +int xio_set_concealed(struct xio_win *xw, int on) +{ +    on = !!on; +    if (xw->reveal == on) +	return on; + +    xw->reveal = on; +    xw->modified |= xw->concealed; +    return !on; +} + + +static void sel_set(struct xio_win *xw, int x1, int y1, int x2, int y2) +{ +    int t; + +    x1 = bound(0, x1, W-1); +    y1 = bound(0, y1, H-1); +    x2 = bound(0, x2, W-1); +    y2 = bound(0, y2, H-1); + +    if (x1 > x2) +	t = x1, x1 = x2, x2 = t; +    if (y1 > y2) +	t = y1, y1 = y2, y2 = t; + +    dirty(xw, xw->sel_y1, xw->sel_y2); + +    if (xw->hidden & (1 << y1)) +	y1--; +    if (xw->hidden & (2 << y2)) +	y2++; + +    xw->sel_x1 = x1; +    xw->sel_y1 = y1; +    xw->sel_x2 = x2 + 1; +    xw->sel_y2 = y2 + 1; +    dirty(xw, xw->sel_y1, xw->sel_y2); +} + + +static void sel_abort(struct xio_win *xw) +{ +    if (xw->sel_set_t) +	XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, None, xw->sel_set_t); +    if (xw->sel_y1 != NO_SEL) +	dirty(xw, xw->sel_y1, xw->sel_y2); +    xw->sel_y1 = NO_SEL; +    xw->sel_set_t = 0; +    xw->sel_start_t = 0; +} + + +static void sel_start(struct xio_win *xw, int x, int y, Time t) +{ +    sel_abort(xw); +    xw->sel_start_x = x; +    xw->sel_start_y = y; +    xw->sel_start_t = t; +} + + +static void sel_move(struct xio_win *xw, int x, int y, Time t) +{ +    if (xw->sel_start_t == 0) +	return; +    if (xw->sel_y1 == NO_SEL) +	if (t - xw->sel_start_t < SEL_MIN_TIME) +	    if (x == xw->sel_start_x) +		if (y == xw->sel_start_y) +		    return; +    sel_set(xw, xw->sel_start_x, xw->sel_start_y, x, y); +} + + +static int sel_end(struct xio_win *xw, int x, int y, Time t) +{ +    sel_move(xw, x, y, t); +    xw->sel_start_t = 0; + +    if (xw->sel_y1 == NO_SEL) +	return 0; + +    for_all_windows(sel_abort, xw); +    XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, xw->win, t); +    if (XGetSelectionOwner(xw->xio->dpy, XA_PRIMARY) == xw->win) +	xw->sel_set_t = t; +    else +	sel_abort(xw); +    return 1; +} + + +static int sel_convert2ascii(struct xio_win *xw, u8 *buf) +{ +    u8 *d = buf; +    int x, y, nl = 0; + +    for (y = xw->sel_y1; y < xw->sel_y2; y++) +    { +	u8 *s = xw->ch + y * W; +	int gfx = 0, con = 0; + +	if (~xw->hidden & (1 << y)) +	{ +	    for (x = 0; x < xw->sel_x2; ++x) +	    { +		int ch, c = ' '; +		switch (ch = *s++) +		{ +		    case 0x00 ... 0x07: +			gfx = con = 0; +			break; +		    case 0x10 ... 0x17: +			gfx = 1, con = 0; +			break; +		    case 0x18: +			con = not xw->reveal; +			break; +		    case 0xa0 ... 0xff: +		    case 0x20 ... 0x7f: +			if (not con) +			    if (gfx && ch != ' ' && (ch & 0xa0) == 0x20) +				c = '#'; +			    else if (ch == 0x7f) +				c = '*'; +			    else +				c = ch; +			break; +		} +		if (x >= xw->sel_x1) +		{ +		    if (nl) +			*d++ = '\n', nl = 0; +		    *d++ = c; +		} +	    } +	    nl = 1; +	} +    } +    *d = 0; // not necessary +    return d - buf; +} + + +static Pixmap sel_convert2pixmap(struct xio_win *xw) +{ +    struct xio *xio = xw->xio; +    Pixmap pm; + +    if (xw->sel_y1 == NO_SEL) +    return None; + +    pm = XCreatePixmap(xio->dpy, xio->root, (xw->sel_x2 - xw->sel_x1) * CW, +					    (xw->sel_y2 - xw->sel_y1) * CH, +								 xio->depth); +    xw->sel_pixmap = pm; +    dirty(xw, xw->sel_y1, xw->sel_y2); +    xio_update_win(xw); +    xw->sel_pixmap = 0; + +    return pm; +} + + +static int sel_do_conv(struct xio_win *xw, Window w, Atom type, Atom prop) +{ +    struct xio *xio = xw->xio; + +    if (type == xio->xa_targets) +    { +	u32 atoms[6]; + +	atoms[0] = XA_STRING; +	atoms[1] = xio->xa_text; +	atoms[2] = XA_PIXMAP; +	atoms[3] = XA_COLORMAP; +	atoms[4] = xio->xa_multiple; +	atoms[5] = xio->xa_timestamp; +	XChangeProperty(xio->dpy, w, prop, type, +				32, PropModeReplace, PTR atoms, NELEM(atoms)); +    } +    else if (type == xio->xa_timestamp) +    { +	u32 t = xw->sel_set_t; + +	XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1); +    } +    else if (type == XA_COLORMAP) +    { +	u32 t = xio->cmap; + +	XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1); +    } +    else if (type == XA_STRING || type == xio->xa_text) +    { +	u8 buf[H * (W+1)]; +	int len; + +	len = sel_convert2ascii(xw, buf); + +	XChangeProperty(xio->dpy, w, prop, type, 8, PropModeReplace, buf, len); +    } +    else if (type == XA_PIXMAP || type == XA_DRAWABLE) +    { +	Pixmap pm; + +	pm = sel_convert2pixmap(xw); + +	XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &pm, 1); +    } +    else if (type == xio->xa_multiple) +    { +	u32 *atoms, ty, fo, i; +	unsigned long n, b; + +	if (prop != None) +	{ +	    if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, 0, +			AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &atoms)) +	    { +		if (fo == 32 && n%2 == 0) +		{ +		    for (i = 0; i < n; i += 2) +			if (sel_do_conv(xw, w, atoms[i], atoms[i+1]) == None) +			    atoms[i] = None; +		} +		XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, +								 PTR atoms, n); +		XFree(atoms); +	    } +	} +    } +    else +	return None; +    return prop; +} + + +static void sel_send(struct xio_win *xw, XSelectionRequestEvent *req) +{ +    XSelectionEvent ev[1]; + +    if (req->property == None) +	req->property = req->target; + +    ev->type = SelectionNotify; +    ev->requestor = req->requestor; +    ev->selection = req->selection; +    ev->target = req->target; +    ev->property = sel_do_conv(xw, req->requestor, req->target, req->property); +    ev->time = req->time; +    XSendEvent(xw->xio->dpy, req->requestor, False, 0, PTR ev); +} + + +static void sel_retrieve(struct xio_win *xw, Window w, Atom prop, int del) +{ +    u8 *data; +    u32 ty, fo; +    unsigned long n, b; +    struct xio *xio = xw->xio; + +    if (prop == None) +	return; + +    if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, del, +			AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &data)) +    { +	if (fo == 8 && n != 0) +	{ +	    struct vt_event vtev[1]; + +	    vtev->resource = xw; +	    vtev->type = EV_SELECTION; +	    vtev->i1 = n; +	    vtev->p1 = data; +	    xw->handler(xw->data, vtev); +	} +	XFree(data); +    } +} + + +void xio_cancel_selection(struct xio_win *xw) +{ +    sel_abort(xw); +} + + +void xio_query_selection(struct xio_win *xw) +{ +    struct xio *xio = xw->xio; + +    if (XGetSelectionOwner(xio->dpy, XA_PRIMARY) == None) +	sel_retrieve(xw, xio->root, XA_CUT_BUFFER0, False); +    else +    { +	XDeleteProperty(xio->dpy, xw->win, XA_STRING); +	XConvertSelection(xio->dpy, XA_PRIMARY, XA_STRING, +					    XA_STRING, xw->win, xw->tstamp); +    } +} + + +void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2) +{ +    sel_start(xw, x1, y1, xw->tstamp - SEL_MIN_TIME); +    sel_end(xw, x2, y2, xw->tstamp); +} + + +static void handle_event(struct xio *xio, int fd) +{ +    struct xio_win *xw; +    struct vt_event vtev[1]; +    XEvent ev[1]; + +    XNextEvent(xio->dpy, ev); + +    for (xw = PTR xio->windows->first; xw->node->next; xw = PTR xw->node->next) +	if (xw->win == ev->xany.window) +	    break; +    if (xw->node->next == 0) +	return; + +    vtev->resource = xw; + +    switch(ev->type) +    { +	case Expose: +	{ +	    int y1 = ev->xexpose.y / CH; +	    int y2 = (ev->xexpose.y + ev->xexpose.height + CH-1) / CH; + +	    dirty(xw, y1, y2); +	    break; +	} +	case ClientMessage: +	{ +	    vtev->type = EV_CLOSE; +	    if (ev->xclient.format == 32) +		if ((Atom)ev->xclient.data.l[0] == xio->xa_del_win) +		    xw->handler(xw->data, vtev); +	    break; +	} +	case KeyPress: +	{ +	    unsigned char ch; +	    KeySym k; + +	    xw->tstamp = ev->xkey.time; +	    vtev->type = EV_KEY; +	    vtev->i1 = 0; +	    vtev->i2 = (ev->xkey.state & ShiftMask) != 0; +	    if (XLookupString(&ev->xkey, &ch, 1, &k, 0)) +		vtev->i1 = ch; +	    else +		switch (k) +		{ +		    case XK_Left:	vtev->i1 = KEY_LEFT;	break; +		    case XK_Right:	vtev->i1 = KEY_RIGHT;	break; +		    case XK_Up:		vtev->i1 = KEY_UP;	break; +		    case XK_Down:	vtev->i1 = KEY_DOWN;	break; +		    case XK_Prior:	vtev->i1 = KEY_PUP;	break; +		    case XK_Next:	vtev->i1 = KEY_PDOWN;	break; +		    case XK_Delete:	vtev->i1 = KEY_DEL;	break; +		    case XK_Insert:	vtev->i1 = KEY_INS;	break; +		    case XK_F1:		vtev->i1 = KEY_F(1);	break; +		    case XK_F2:		vtev->i1 = KEY_F(2);	break; +		    case XK_F3:		vtev->i1 = KEY_F(3);	break; +		    case XK_F4:		vtev->i1 = KEY_F(4);	break; +		    case XK_F5:		vtev->i1 = KEY_F(5);	break; +		    case XK_F6:		vtev->i1 = KEY_F(6);	break; +		    case XK_F7:		vtev->i1 = KEY_F(7);	break; +		    case XK_F8:		vtev->i1 = KEY_F(8);	break; +		    case XK_F9:		vtev->i1 = KEY_F(9);	break; +		    case XK_F10:	vtev->i1 = KEY_F(10);	break; +		    case XK_F11:	vtev->i1 = KEY_F(11);	break; +		    case XK_F12:	vtev->i1 = KEY_F(12);	break; +		} +	    if (vtev->i1) +		xw->handler(xw->data, vtev); +	    break; +	} +	case ButtonPress: +	{ +	    xw->tstamp = ev->xkey.time; +	    ev->xbutton.x /= CW; +	    ev->xbutton.y /= CH; +	    if (ev->xbutton.button == Button1) +		sel_start(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time); +	    break; +	} +	case MotionNotify: +	{ +	    xw->tstamp = ev->xkey.time; +	    ev->xmotion.x /= CW; +	    ev->xmotion.y /= CH; +	    if (ev->xmotion.state & Button1Mask) +		sel_move(xw, ev->xmotion.x, ev->xmotion.y, ev->xmotion.time); +	    break; +	} +	case ButtonRelease: +	{ +	    xw->tstamp = ev->xkey.time; +	    ev->xbutton.x /= CW; +	    ev->xbutton.y /= CH; +	    if (ev->xbutton.button == Button1) +		if (sel_end(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time)) +		    break; + +	    vtev->type = EV_MOUSE; +	    vtev->i1 = ev->xbutton.button; +	    vtev->i2 = (ev->xbutton.state & ShiftMask) != 0; +	    vtev->i3 = ev->xbutton.x; +	    vtev->i4 = ev->xbutton.y; +	    if (vtev->i3 >= 0 && vtev->i3 < W && vtev->i4 >= 0 && vtev->i4 < H) +		xw->handler(xw->data, vtev); +	    break; +	} +	case SelectionClear: +	{ +	// may be our own Owner=None due to sel_start +	    if (xw->sel_set_t && ev->xselectionclear.time >= xw->sel_set_t) +	    { +		xw->sel_set_t = 0; // no need to reset owner +		sel_abort(xw); +	    } +	    break; +	} +	case SelectionRequest: +	{ +	    sel_send(xw, &ev->xselectionrequest); +	    break; +	} +	case SelectionNotify: +	{ +	    sel_retrieve(xw, ev->xselection.requestor, ev->xselection.property, True); +	    break; +	} +	default: +		break; +    } +} + + +static void switch_blink_state(struct xio_win *xw) +{ +    xw->blink_on = !xw->blink_on; +    xw->modified |= xw->blink; +    dirty(xw, xw->curs_y, xw->curs_y + 1); +} + + +static void send_timer_event(struct xio_win *xw) +{ +    struct vt_event vtev[1]; +    vtev->type = EV_TIMER; +    xw->handler(xw->data, vtev); +} + + +static void xio_timer(void *data, int fd) +{ +    char buf[64]; +    read(fd, buf, sizeof(buf)); +    for_all_windows(switch_blink_state, 0); +    for_all_windows(send_timer_event, 0); +} + + +void xio_event_loop(void) +{ +    struct xio *xio, *vtn; +    int f; + +    while (not dl_empty(dpys)) +    { +	do +	{ +	    for_all_windows(xio_update_win, 0); +	    f = 0; +	    for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn) +		while (XPending(xio->dpy)) +		{ +		    handle_event(xio, xio->fd); +		    f++; +		} +	} while (f); +	fdset_select(fds, -1); +    } +} diff --git a/util/alevt/xio.h b/util/alevt/xio.h new file mode 100644 index 0000000..664b701 --- /dev/null +++ b/util/alevt/xio.h @@ -0,0 +1,80 @@ +#ifndef VTXIO_H +#define VTXIO_H + +#include <X11/Xlib.h> +#include "vt.h" +#include "dllist.h" + +typedef u32 lbits; +#define ALL_LINES ((1ul << H) - 1) + +/* one xio per display */ +struct xio +{ +    struct dl_node node[1]; +    int argc; +    char **argv; +    Display *dpy;			/* display connection */ +    int fd;				/* the displays file descriptor */ +    Atom xa_del_win;			/* WM_DELETE_WINDOW atom */ +    Atom xa_targets;			/* TARGETS atom (selection) */ +    Atom xa_timestamp;			/* TIMESTAMP atom (selection) */ +    Atom xa_text;			/* TEXT atom (selection) */ +    Atom xa_multiple;			/* MULTIPLE atom (selection) */ +    Window group_leader;		/* unmapped window */ +    int screen;				/* DefaultScreen */ +    int width, height;			/* DisplayWidth/Height */ +    int depth;				/* DefaultDepth */ +    Window root;			/* DefaultRoot */ +    Colormap cmap; +    int color[16];			/* 8 normal, 8 dim intensity */ +    Pixmap font[2];			/* normal, dbl-height */ +    Pixmap icon;			/* icon pixmap */ +    struct dl_head windows[1];		/* all windows on this display */ +}; + +/* one vt_win per window */ +struct xio_win +{ +    struct dl_node node[1]; +    struct xio *xio;			/* display */ +    Window win;				/* the drawing window */ +    Time tstamp;			/* timestamp of last user event */ +    GC gc;				/* it's graphics context */ +    u8 ch[H*W];				/* the page contents */ +    lbits modified, hidden, lhidden;	/* states for each line */ +    lbits dheight, blink, concealed;	/* attributes for each line */ +    int fg, bg;				/* current foreground/background */ +    int blink_on;			/* blinking on */ +    int reveal;				/* reveal concealed text */ +    void (*handler)(void *data, struct vt_event *ev); /* event-handler */ +    void *data;				/* data for the event-handler */ +    int curs_x, curs_y;			/* cursor position */ +    u8 title[32];			/* the user title */ +    // selection support +    int sel_start_x, sel_start_y; +    Time sel_start_t; +    Time sel_set_t;			/* time we got selection owner */ +    int sel_x1, sel_y1, sel_x2, sel_y2;	/* selected area */ +    Pixmap sel_pixmap;			/* for pixmap-selection requests */ +}; + +struct xio *xio_open_dpy(char *dpy, int argc, char **argv); +struct xio_win *xio_open_win(struct xio *xio, char *geom); +void xio_close_win(struct xio_win *xw, int dpy_too); +void xio_close_dpy(struct xio *xio); +void xio_set_handler(struct xio_win *xw, void *handler, void *data); +void xio_clear_win(struct xio_win *xw); +void xio_put_line(struct xio_win *xw, int line, u8 *data); +void xio_put_str(struct xio_win *xw, int line, u8 *c_str); +int xio_get_line(struct xio_win *xw, int line, u8 *data); +int xio_set_concealed(struct xio_win *xw, int on); +void xio_update_win(struct xio_win *xw); +void xio_fd_handler(int fd, void *handler, void *data); +void xio_cancel_selection(struct xio_win *xw); +void xio_query_selection(struct xio_win *xw); +void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2); +void xio_set_cursor(struct xio_win *xw, int x, int y); +void xio_event_loop(void); +void xio_title(struct xio_win *xw, char *title); +#endif  | 
